Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Парсер файла (поиск разделителя и поиск признака начала нужной строки) / 12 сообщений из 12, страница 1 из 1
05.03.2013, 11:54
    #38174354
2king2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер файла (поиск разделителя и поиск признака начала нужной строки)
Решил заняться изучением LINQ и PLINQ и сразу попалась не тривиальная задача. Необходимо найти строки, которые начинаются на FGST и вытащить из этой строки 5,6 и 6 значение. Направите на путь истинный. Как сделать?

FK|TXFG090925|АСФК|9.0||
FROM|9500|ФЕДЕРАЛЬНОЕ КАЗНАЧЕЙСТВО|
TO|2|19001|МИНИСТЕРСТВО ФИНАНСОВ НИЖЕГОРОДСКОЙ ОБЛАСТИ|||
FG|3B296774-F1EC-424F-B8A7-0CBE01BDDEF9|Федеральный бюджет|01.01.2009|Исполнитель|Сидоров С.М.|215-64-25|
FGST |6F9619FF-8B86-D011-B42D-00C04FC964F1||9500| 210 | Оплата труда и начисления на оплату труда |Оплата труда и начисления на оплату труда|01.01.2008|| 1 |01.01.2008 15:00:00|
FGST |6F9619FF-8B86-D011-B42D-00C04FC964FA|6F9619FF-8B86-D011-B42D-00C04FC964FB|9500| 211 | Заработная плата |Заработная плата|01.01.2008|| 1 |01.01.2008 15:00:00|
FGST |6F9619FF-8B86-D011-B42D-00C04FC96411|6F9619FF-8B86-D011-B42D-00C04FC96412|9500| 212 | Прочие выплаты |Прочие выплаты|01.01.2008|| 1 |01.01.2008 15:00:00|
...
Рейтинг: 0 / 0
05.03.2013, 12:59
    #38174499
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер файла (поиск разделителя и поиск признака начала нужной строки)
Все гуано в кучку :)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var instr = @"FK|TXFG090925|АСФК|9.0||
FROM|9500|ФЕДЕРАЛЬНОЕ КАЗНАЧЕЙСТВО|
TO|2|19001|МИНИСТЕРСТВО ФИНАНСОВ НИЖЕГОРОДСКОЙ ОБЛАСТИ|||
FG|3B296774-F1EC-424F-B8A7-0CBE01BDDEF9|Федеральный бюджет|01.01.2009|Исполнитель|Сидоров С.М.|215-64-25|
FGST|6F9619FF-8B86-D011-B42D-00C04FC964F1||9500|210|Оплата труда и начисления на оплату труда|Оплата труда и начисления на оплату труда|01.01.2008||1|01.01.2008 15:00:00|
FGST|6F9619FF-8B86-D011-B42D-00C04FC964FA|6F9619FF-8B86-D011-B42D-00C04FC964FB|9500|211|Заработная плата|Заработная плата|01.01.2008||1|01.01.2008 15:00:00|
FGST|6F9619FF-8B86-D011-B42D-00C04FC96411|6F9619FF-8B86-D011-B42D-00C04FC96412|9500|212|Прочие выплаты|Прочие выплаты|01.01.2008||1|01.01.2008 15:00:00|";
var idxs = new int[]{4, 5};

instr.Split(new char[] {'\r', '\n'})
	 .Where(line => line.StartsWith("FGST|"))
	 .Select(line => String.Join("|",line.Split(new char[] {'|'}).Where((i, v) => idxs.Contains(v)))
	 ) .Dump();
...
Рейтинг: 0 / 0
05.03.2013, 14:02
    #38174597
2king2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер файла (поиск разделителя и поиск признака начала нужной строки)
buser
Код: c#
1.
) .Dump();


Error

'System.Collections.Generic.IEnumerable<string>' does not contain a definition for 'Dump' and no extension method 'Dump' accepting a first argument of type 'System.Collections.Generic.IEnumerable<string>' could be found (are you missing a using directive or an assembly reference?)
...
Рейтинг: 0 / 0
05.03.2013, 14:54
    #38174686
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер файла (поиск разделителя и поиск признака начала нужной строки)
.ToList() ?
...
Рейтинг: 0 / 0
08.03.2013, 12:13
    #38178033
2king2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер файла (поиск разделителя и поиск признака начала нужной строки)
buser.ToList() ?
Да спасибо, так работает, но задача поменялась нужен XML на выходе. Теперь я в полной прострации как?
...
Рейтинг: 0 / 0
08.03.2013, 15:55
    #38178114
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер файла (поиск разделителя и поиск признака начала нужной строки)
Приведите пример того что вам нужно - результирующий xml.
Любую задачу можно решить "в лоб"... В какое место вам линк уперся я не пойму...
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
var instr = @"FK|TXFG090925|АСФК|9.0||
FROM|9500|ФЕДЕРАЛЬНОЕ КАЗНАЧЕЙСТВО|
TO|2|19001|МИНИСТЕРСТВО ФИНАНСОВ НИЖЕГОРОДСКОЙ ОБЛАСТИ|||
FG|3B296774-F1EC-424F-B8A7-0CBE01BDDEF9|Федеральный бюджет|01.01.2009|Исполнитель|Сидоров С.М.|215-64-25|
FGST|6F9619FF-8B86-D011-B42D-00C04FC964F1||9500|210|Оплата труда и начисления на оплату труда|Оплата труда и начисления на оплату труда|01.01.2008||1|01.01.2008 15:00:00|
FGST|6F9619FF-8B86-D011-B42D-00C04FC964FA|6F9619FF-8B86-D011-B42D-00C04FC964FB|9500|211|Заработная плата|Заработная плата|01.01.2008||1|01.01.2008 15:00:00|
FGST|6F9619FF-8B86-D011-B42D-00C04FC96411|6F9619FF-8B86-D011-B42D-00C04FC96412|9500|212|Прочие выплаты|Прочие выплаты|01.01.2008||1|01.01.2008 15:00:00|";

var ld = new char[] {'\r', '\n'};
var cd = new char[] {'|'};
var xml = new XElement("DOC", instr.Split( ld, StringSplitOptions.RemoveEmptyEntries)
										 .Select(line => new XElement(line.Split(cd)[0],
      											line.Split(cd)
													.Where((column, index) => index > 0)
          											.Select((column, index) => new XElement("Item" + index, column)))));
xml.ToString();

...
Рейтинг: 0 / 0
08.03.2013, 16:10
    #38178120
2king2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер файла (поиск разделителя и поиск признака начала нужной строки)
buserПриведите пример того что вам нужно - результирующий xml.
В ветке про XML http://www.sql.ru/forum/actualthread.aspx?tid=1009567
Надеюсь меня за флуд не забанят
...
Рейтинг: 0 / 0
08.03.2013, 18:19
    #38178171
2king2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер файла (поиск разделителя и поиск признака начала нужной строки)
buserЛюбую задачу можно решить "в лоб"... В какое место вам линк уперся я не пойму...
Мой скудный опыт меня занес на LINQ. Кстати, предложенное Вами решение почти, то что нужно, спасибо. А кроме линка какие варианты еще есть? Хочется красивое и универсальное решение)

Мне бы вот такой XML на выходе получить
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<?xml version="1.0" encoding="utf-8"?>
<FILENAME>
  <FK>
    <NUM_VER>TXFF090925</NUM_VER>
    <FORMER>АСФК</FORMER>
    <FORM_VER>9.0</FORM_VER>
    <NORM_DOC/>
  </FK>
  <FROM>
    <KOD_TOFK>9500</KOD_TOFK>
    <NAME_TOFK>ИВАН ИВАНОВ</NAME_TOFK>
  </FROM>
  <TO>
    <BUDG_LEVEL>2</BUDG_LEVEL>
    <KOD_UBP>19001</KOD_UBP>
    <NAME_UBP>ИНТЕРПРАЙС</NAME_UBP>
    <KOD_TOFK/>
    <NAME_TOFK/>
  </TO>
  <FF>
    <GUID_FK>3B296774-F1EC-424F-B8A7-0CBE01BDDEF9</GUID_FK>
    <NAME_BUD>Бюджет</NAME_BUD>
    <DATE_FORM>01.01.2009</DATE_FORM>
    <DOL_ISP>Исполнитель</DOL_ISP>
    <NAME_ISP>Сидоров С.М.</NAME_ISP>
    <TEL_ISP>215-64-25</TEL_ISP>
  </FF>
  <FFST GUID="6F9619FF-8B86-D011-B42D-00C04FC964FF" GUID_PARENT="6F9619FF-8B86-D011-B42D-00C04FC964F1" KOD_TOFK_C="9500" RAZDEL="0403" CNAME="Исследование" NAME="Исследование букашек" DATE_BEGIN="01.01.2008" DATE_END="" STATUS="1" DATE_CHANGE="01.01.2008 15:00:00"/>
  <FFST GUID="6F9619FF-8B86-D011-B42D-00C04FC96411" GUID_PARENT="F9619FF-8B86-D011-B42D-00C04FC96412" KOD_TOFK_C="9500" RAZDEL="0403" CNAME="Прочие выплаты" NAME="Прочие букашек" DATE_BEGIN="01.01.2008" DATE_END="" STATUS="1" DATE_CHANGE="01.01.2008 15:00:00"/>
</FILENAME>






...
Рейтинг: 0 / 0
09.03.2013, 13:48
    #38178424
2king2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер файла (поиск разделителя и поиск признака начала нужной строки)
buser,

Стал ковырять Ваш код, но что не выходит каменный цветок

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class TFF
{
   public XElement FK;
   string[] FK = new string[] { "NUM_VER", "FORMER", "FORM_VER" };
   ...
   public XAttribute FGST;
}

var xml = new XElement("DOC", instr.Split(ld, StringSplitOptions.RemoveEmptyEntries)
            .Select(line => new XElement(line.Split(cd)[0], line.Split(cd)
            .Where((column, index) => index > 0)
            .Select((column, index) => new TFF(line.Split(cd)[0] + index, column)))));
...
Рейтинг: 0 / 0
09.03.2013, 20:31
    #38178558
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер файла (поиск разделителя и поиск признака начала нужной строки)
xslt - отрихтуйте как вам нужно...
Если не клинить на линкью, все можно сделать без затей... Но каждый сам себе злобный буратино :)
...
Рейтинг: 0 / 0
10.03.2013, 13:11
    #38178814
2king2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер файла (поиск разделителя и поиск признака начала нужной строки)
buser,

Ого!!! Я даже не знал, что так можно. СПАСИБО!!!
...
Рейтинг: 0 / 0
24.03.2013, 12:34
    #38196379
2king2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсер файла (поиск разделителя и поиск признака начала нужной строки)
buserxslt - отрихтуйте как вам нужно...
Если не клинить на линкью, все можно сделать без затей... Но каждый сам себе злобный буратино :)
У меня первая и последняя строчка файла отличны от структуры всего фала, т.е. не имеют разделители '|'
А как можно используя предложенный вами парсер сделать так, чтобы первая и последняя строчка тоже парсились?

Код: sql
1.
2.
3.
20.02.2013 создания файла
...|...|....
Всего строк - 12


Нужно на выходе, что-то такое
Код: xml
1.
2.
3.
4.
5.
6.
<?xml version="1.0" encoding="utf-8"?>
<FILENAME>
  <DATE_CREATE>20.02.2013 создания файла</DATE_CREATE>
  ...
  <TOTAL_LINES>Всего строк - 12</TOTAL_LINES>
<FILENAME>
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Парсер файла (поиск разделителя и поиск признака начала нужной строки) / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]