Member 10628309 Ответов: 2

Как прочитать только первые 12 столбцов CSV-файла и сохранить его в новом csv - файле


У меня есть CSV-файл с 75 столбцами и 400 строками. Меня интересуют только первые 12 колонок. Как я могу прочитать первые 12 столбцов и сохранить в новой строке, прочитать следующую строку, прочитав только первые 12 столбцов, затем добавить в новую строку и т. д. Так что я получаю новый CSV-файл, содержащий только первые 12 столбцов исходного CSV-файла. У меня есть идея, которую вы можете увидеть в приведенном ниже коде, но она ошибочна, и я не знаю, как действовать дальше. Моя идея состояла в том, чтобы считать запятые, и когда вы достигнете более 12, вы прочитаете следующую строку. Может быть, это сработает, но я не уверен.

Что я уже пробовал:

Using readFile As New StreamReader(phrfListFile)
            Do While readFile.Peek() <> -1
                Str = readFile.ReadLine()
                For Each c As Char In Str
                    If c = "," Then
                        cnt += 1
                    End If
                Next
                If cnt = 12 Then
                    ShortStr = ShortStr + Str
                End If
                cnt = 0
            Loop

        End Using
        File.WriteAllText("C:\Race\ShortStr", ShortStr)

2 Ответов

Рейтинг:
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

Dave Kreskowiak

Ваш "парсер" очень наивен. Если есть поле с запятой в нем, например "фамилия, имя", Ваш синтаксический анализатор неправильно проанализирует строку.

Используйте библиотеку CSV для анализа файла, а затем вы можете записать необходимые поля в новый CSV-файл.

На CP есть куча CSV-библиотек, например
Простая и быстрая библиотека CSV на языке C#[^]
Зачем создавать свой собственный CSV-парсер (а может и нет)[^]


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 строки меньше кода. Если это сообщение звучит как извинение, то так оно и есть.