Рейтинг:
11
Member 10628309
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
OpenFileDialog1.Filter = "CSV File|*.CSV"
phrfListFile = OpenFileDialog1.FileName
End If
Catch ex As Exception
End Try
Dim SReader As New StreamReader(phrfListFile)
Dim SWriter As New StreamWriter("C:\Race\NewphrfListFile.CSV")
Dim strData() As String
Do While SReader.Peek <> -1
strData = Split(SReader.ReadLine, ",")
SWriter.WriteLine(strData(0) & "," & strData(1) & "," & strData(2) & "," & strData(3) _
& "," & strData(9) & "," & strData(10) & "," & strData(11) & "," & strData(12))
Loop
SReader.Close()
SWriter.Close()
End Sub
End Class
Рейтинг:
1
Member 10628309
Ваше замечание относительно того, что я бы назвал посторонними запятыми, не относится к делу. CSV-файл создается на компьютере с деактивированной запятой...только программа может вставлять запятые в конце каждого поля. Тем не менее, ваша точка зрения хорошо принята. Статьи, на которые вы ссылаетесь, касаются только поврежденных или отсутствующих полей. По крайней мере, так я их читаю. Я ничего не вижу в удалении полей.
Dave Kreskowiak
Вздох...
Во-первых, не имеет значения, отключена клавиша запятой или нет. Если данные доступны для выполнения чего-то вроде экспорта "фамилия, имя", компьютер может создать CSV-файл, который ваш код не может разобрать.
Во-вторых, ничто не будет ссылаться на удаление полей. Вы должны проанализировать каждую строку CSV, чтобы добраться до конца текущей строки и узнать, где находится начало следующей строки.
Каждый CSV-парсер выдаст вам полный список полей для каждой строки. Некоторые будут делать это в массиве возвращаемых строк, другие будут заполнять свойства класса, представляющего все данные в каждой строке. Затем вам предстоит определить, какие данные из всего, что доступно для каждой строки, записать в ваш собственный CSV-файл.
Ваш синтаксический анализатор делает ошибку, читая текстовый файл по символам, а не по строкам. Разбор строки намного проще, чем разбор символов.
Member 10628309
I am sure will sigh more after reading this. I should have informed you that the source csv file was first created more than 15 years ago and updated hundreds of times, and has never had an inadvertent comma even once. I don't have to accept anyone's csv file. However as I said before my solution blows up if there is an inadvertent comma as you warned me. I thank you for your advice, it is good advice and when I become more experienced I will pursue the parsers you suggested. I did read all of the material you referenced. I will try at least one on the parsers, maybe more. The solution I show below works perfectly but as you point out is vulnerable.
Member 10628309
Ты был совершенно прав. У меня было неправильное представление о назначении парсера. Я думал о том, как словарь определяет синтаксический анализатор. CSV-файл, который мне нужно было обработать, был полностью переписан и утроен по размеру, в нем по-прежнему нет случайных запятых, но есть и другие вещи, которые не обрабатываются должным образом, как вы указали. Теперь я использую TextFieldParser, который требует импорта Microsoft.VisualBasic.FileIO. Он обрабатывает все грязные вещи, которые не были бы доступны предыдущему синтаксическому анализатору. Это также позволяет мне написать по крайней мере на 2 строки меньше кода. Если это сообщение звучит как извинение, то так оно и есть.