Преобразование текстового файла с разделителями пробелами в CSV VB.NET
У меня есть сотни разделенных пробелами текстовых файлов, которые я хотел бы преобразовать в VB.NET в CSV-файлы в соответствии с RFC 4180. Файлы имеют различную длину, но могут содержать до 200000 строк и различное количество столбцов (до 30), разделенных несколькими "пробелами", которые также варьируются от одного до 20. Файлы содержат некоторую информацию, которую я хотел бы удалить, например первый столбец, и я также хотел бы изменить содержимое второго столбца на допустимый Штамп времени Javascript. Это пример первых строк одного из файлов (обратите внимание, что большая часть пробелов не показана).
# временной порядок boil_q_1 boil_q_2 chil_q1 chil_q2 loccool locheat qdomwat
0,000000000 1,0000 4,18700E-09 0,0000 4,18700E-11 1,31529E-03 132,39 9799,3 0,0000
8.0000000000E-02 1.0000 4.18700E-09 0.0000 4.18700E-11 1.31528E-03 132.11 9917.1 0.0000
0,1600000000 1,0000 4,18700E-09 0,0000 4,18700E-11 1,31527E-03 131,98 10047. 0,0000
0,2705515735 1,0000 4,18700E-09 0,0000 4,18700E-11 1,31527E-03 131,97 10152. 0,0000
0,2705515763 1,0000 4,18700E-09 0,0000 4,18700E-11 1,31526E-03 131,97 10152. 0,0000
0,3345515763 1,0000 4,18700E-09 0,0000 4,18700E-11 1,31525E-03 131,97 10184. 0,0000
0,3985515763 1,0000 4,18700E-09 0,0000 4,18700E-11 1,31524E-03 131,98 10192. 0,0000
0,5265515763 1,0000 4,18700E-09 0,0000 4,18700E-11 1,31524E-03 131,98 10178. 0,0000
0,7825515763 1,0000 4,18700E-09 0,0000 4,18700E-11 1,31523E-03 131,99 10164. 0,0000
0,7825515791 1,0000 4,18700E-09 0,0000 4,18700E-11 1,31522E-03 131,99 10164. 0,0000
Любые предложения будут приветствоваться.
С уважением Макс
2 ответа
Предполагая, что переменное количество пробелов не потому, что столбцы пусты...
Я хотел бы просто сделать это простым и использовать инструменты, к которым привык, грубые, но быстрые для меня:
Dim s As String = TextBox1.Text
s = s.Replace(vbNewLine, "|").Replace(vbCr, "").Replace(vbLf, "")
s = s.Replace("| ", "|") ' trim leading space
Dim iLen As Integer = -1
Do
iLen = s.Length
s = s.Replace(" ", " ")
Loop Until iLen = s.Length
Dim aLines() As String = s.Split("|")
Dim aLine() As String
Dim aHeader() As String = aLines(0).Split(" ")
' process header
For i As Long = 1 To aLines.GetUpperBound(0)
aLine = aLines(i).Split(" ")
Stop
' process line
Next
TextBox1 содержит ваш образец с помехами? ведущий #. Если изменяющиеся пробелы обусловлены пустыми столбцами, массажирование будет более сложным и, возможно, будет лучше выполнено во внутреннем цикле.
Выше я просто массирую всю строку, затем помещаю строки в массив, а затем зацикливаю их.
Это единственный первый шаг в ОП.
Я обнаружил, что написание CSV проблематично, тем более что у потребителей иногда бывают разные идеи относительно того, что говорится в спецификации. Если возможно, протестируйте с помощью программы конечного потребления.
В итоге я использовал следующий код и добавил информацию в сетку данных
Dim rowvalue As String
Dim streamReader As IO.StreamReader = New IO.StreamReader(FileName)
While streamReader.Peek() <> -1
rowvalue = streamReader.ReadLine()
DataGridView1.Rows.Add(rowvalue.Split(New String() {" "}, StringSplitOptions.RemoveEmptyEntries))
End While
Проблема в том, что он довольно медленный, и мне все еще нужно удалить один из кумнов и добавить все остальные файлы. Я думаю, что было бы проще хранить информацию другим способом? Есть идеи?