2015-01-22 2 views
0

Текстовый файл, который я обрабатываю, изменился в способе форматирования данных, поэтому пришло время обновить код, который анализирует его. Старый файл имел фиксированное количество строк и полей на запись, и поэтому синтаксический анализ его по позиции был простым, конечно, теперь это не так (я добавил пробелы для удобочитаемости, символ ~ указывает на новую строку, * - это разделитель полей):Анализ текстового файла с переменными полями Vb.Net

~ лор * 1 * 2J * 34 * 111223333
~ NM1 * IL * 1 * СМИТ Джон А *** Н * 123456789
~ РМР IK H62XX/ОПЛАТА/1234567 /20150103**12345.67
~ REF ZZ MEDPM/М/12345,67
~ REF * LU * 40/CSWI
~ DTM * 582 **** Rd8 * 2 0150101-20150131

~ ENT * 2 * 2J * 34 * 222334444
~ NM1 * IL * 1 * DOE ДЖЕЙН S *** N * 234567891
~ РМР IK H62XX/ОПЛАТА/1234567/345678901 ** 23456,78
~ REF * LU * 40/CSWI
~ DTM * 582 * **** Rd8 20141211-20141231

~ лор * 3 * 2J * 34 * 333445555
~ NM1 * IL * 1 * DOE * JOHN **** N * 3456789012
~ RMR IK H62XX/PAY/200462975/20150103 ** 45678.90
~ REF ZZ MEDPM/М/3456,78
~ REF * LU * 40/CSWI
~ DTM * 582 * **** Rd8 20150101-20150131

~ лор * 4 * 2J * 34 * 444556666
~ NM1 * IL * 1 * SMITH JANE D *** N * 456789012
~ RMR IK H62XX/ОПЛАТА/567890123/6789** 6789,01
~ REF ZZ MEDPM/M/6789,01
~ REF * LU * 40/CSWI
~ DTM * 582 * **** Rd8 20150101-20150131

~ лор * 5 * 2J * 34 * 666778888
~ NM1 * IL * 1 * СМИТ JON J *** Н * 89 ~ RMR IK H62XX/ОПЛАТА/56789012/6789** 5678,90
~ REF ZZ MEDPM/M/5678,90
~ REF * LU * 40/CSWI
~ DTM * 582 **** Rd8 * 20150101-20150131

~ ENT * 6 * 2J * 34 * 777889999 ~ NM1 * IL * 1 * МЭ ЛПП Е *** Н * 56789 ~ РМР IK H62XX/ОПЛАТА/34567890/45678901 * 5678,90
~ REF * LU * 40/CSWI
~ DTM * 582 **** RD8 * 20141210-20141231
~ RMR IK H62XX/PAY/1234567890/2345678901 ** 6789.01
~ REF ZZ MEDPM/M/6789,01
~ REF * LU * 40/CSWI
~ DTM * 582 **** Rd8 * 20150101-20150131

Что является лучшим способом для разбора этого данные? Есть ли лучший способ, чем использование StreamReader?

+0

Что вы пытались до сих пор? – WeSt

+0

Прямо сейчас я думаю о том, что просто использую StreamReader с System.IO.File, но есть класс TextFieldParser ... может быть, это лучший способ? – TrevorBrooks

+0

Обычно ~ в документе EDI находится в конце каждого сегмента, а не в начале. Но @Heinzi правильно, использование 'String.Split' хорошо работает с сегментами EDI. –

ответ

1

String.Split - твой друг.

Если файл не слишком велик, самый простой подход будет заключаться в следующем:

  • Прочитайте содержимое файла в строку переменной (File.ReadAllText).
  • Разделить «линии» (lines = allText.Split("~"c)).
  • Петля через линии. Для каждой строки:
    • Split линии в полях (fields = line.Split("*"c))
    • процесса значения полей. Вероятно, вы захотите иметь большой оператор Select Case на fields(0), а затем продолжить работу в зависимости от первого поля линии.
1

Вы можете получить это в массив 2-D довольно легко:

' Dynamic structure to hold the data as we go. 
Dim data As New List(Of String()) 

' Break each delimiter into a new line. 
Dim lines = System.IO.File.ReadAllText("data.txt").Split("~") 

' Process each line. 
For Each line As String In lines 
    ' Break down the components of each line. 
    data.Add(line.Split("*")) 
Next 

' Produce 2-D array. Not really needed, as you can just use data if you want. 
Dim dataArray = data.ToArray() 

Теперь просто итерацию через структуру 2-D и обрабатывать данные соответственно.

Если вам необходимо обеспечить ваши данные всегда имеет определенное количество индексов (например, некоторые строки 5 полей, поставляемые, но ожидает, что всегда 8), вы можете можете настроить data.Add команды как так :

' Ensure there are always at least 8 indexes for each line. 
' This will insert blank (String.Empty) values into the array indexes if a line of data omits certain values. 
data.Add((line & Space(8).Replace(" ", "*")).Split("*"))