Проанализируйте разграниченный CSV в.NET

Насколько известно, для компонента ScrollView требуется только один дочерний элемент. Попробуйте обернуть все, включая ваш GridLayout, в один LinearLayout.

24
задан Danny_ds 22 February 2016 в 01:07
поделиться

9 ответов

С здесь :

Encoding fileEncoding = GetFileEncoding(csvFile);
// get rid of all doublequotes except those used as field delimiters
string fileContents = File.ReadAllText(csvFile, fileEncoding);
string fixedContents = Regex.Replace(fileContents, @"([^\^,\r\n])""([^$,\r\n])", @"$1$2");
using (CsvReader csv =
       new CsvReader(new StringReader(fixedContents), true))
{
       // ... parse the CSV
7
ответ дан 28 November 2019 в 22:08
поделиться

Я публикую это как ответ, чтобы я мог объяснить, как я это сделал и почему ... Ответ от Митча Уитта был тем, который дал мне лучшее решение для этого случая, и мне просто пришлось немного изменить его из-за в формат, в который были экспортированы эти данные.

Вот код VB:

Dim fixedContents As String = Regex.Replace(
                            File.ReadAllText(csvFile, fileEncoding),
                            "(?<!,)("")(?!,)", 
                            AddressOf ReplaceQuotes)

Использовать RegEx - это то, что мне нужно было изменить, потому что в некоторых полях содержались неэкранированные кавычки, а предоставленный RegEx не показывался работать на всех примерах. В этом случае используются «Look Ahead» и «Look Behind», чтобы узнать, идет ли кавычка сразу после запятой или непосредственно перед. В этом случае они оба отрицательны (то есть показывают, где двойная кавычка не до или после запятой). Это должно означать, что кавычка находится в середине строки.

В этом случае вместо прямой замены я использую функцию ReplaceQuotes, чтобы справиться с этим для меня. Я использую это потому, что мне нужно было немного дополнительной логики, чтобы определить, было ли это в начале строки. Если бы я потратил на это еще больше времени, я уверен, что мог бы настроить RegEx, чтобы учесть начало строки (используя MultiLine и т. Д.), Но когда я попробовал это быстро, это не сработало все.

Имея это в виду, используя CSV-ридер для CSV-файла размером 32 МБ (около 19000 строк), чтение файла, выполнение регулярного выражения, загрузка его в CSV-ридер и добавление всех данных в мой общий файл занимает около 2 секунд. класс и финиш. Очень быстро !!

Я уверен, что мог бы настроить RegEx, чтобы принять во внимание начало строки (используя MultiLine и т. Д.), Но когда я попробовал это быстро, это не сработало вообще.

Имея это в виду, используя CSV-ридер для CSV-файла размером 32 МБ (около 19000 строк), чтение файла, выполнение регулярного выражения, загрузка его в CSV-ридер и добавление всех данных в мой общий файл занимает около 2 секунд. класс и финиш. Очень быстро !!

Я уверен, что мог бы настроить RegEx, чтобы принять во внимание начало строки (используя MultiLine и т. Д.), Но когда я попробовал это быстро, это не сработало вообще.

Имея это в виду, используя CSV-ридер для CSV-файла размером 32 МБ (около 19000 строк), чтение файла, выполнение регулярного выражения, загрузка его в CSV-ридер и добавление всех данных в мой общий файл занимает около 2 секунд. класс и финиш. Очень быстро !!

1
ответ дан hacker 28 November 2019 в 22:08
поделиться

Я рекомендую просмотреть TextFieldParserClass в .Net. Вы должны включить

Imports Microsoft.VisualBasic.FileIO.TextFieldParser

Вот краткий пример:

        Dim afile As FileIO.TextFieldParser = New FileIO.TextFieldParser(FileName)
        Dim CurrentRecord As String() ' this array will hold each line of data
        afile.TextFieldType = FileIO.FieldType.Delimited
        afile.Delimiters = New String() {","}
        afile.HasFieldsEnclosedInQuotes = True

        ' parse the actual file
        Do While Not afile.EndOfData
            Try
                CurrentRecord = afile.ReadFields
            Catch ex As FileIO.MalformedLineException
                Stop
            End Try
        Loop
76
ответ дан 28 November 2019 в 22:08
поделиться

Посмотрите на библиотеку FileHelpers .

5
ответ дан 28 November 2019 в 22:08
поделиться

Есть как минимум драйверы ODBC для файлов CSV. Но есть разные разновидности CSV.

Что произвело эти файлы? Не исключено, что есть соответствующий драйвер, основанный на требованиях исходного приложения.

0
ответ дан 28 November 2019 в 22:08
поделиться

Ваша проблема с CSVReader заключается в том, что в кавычку в третьей записи не добавляется другая кавычка (она же двойная кавычка) , Если вы не избежите их, то как бы вы ожидали обработать ", в середине текстового поля?

http://en.wikipedia.org/wiki/Comma-separated_values ​​

(я закончил до работы с файлами (с разными разделителями), но символы кавычек внутри текстового значения не были экранированы, и я закончил тем, что написал свой собственный синтаксический анализатор. Я не знаю, было ли это абсолютно необходимо или нет.

0
ответ дан 28 November 2019 в 22:08
поделиться

Логика этого нестандартного подхода такова: читать файл по одной строке за раз, разбивать каждую строку на запятую, удалять первый и последний символ (удаляя внешние кавычки, но не затрагивая любые внутренние кавычки), затем добавление данных в общий список. Он короткий и очень удобный для чтения и работы.

        Dim fr As StreamReader = Nothing
        Dim FileString As String = ""
        Dim LineItemsArr() as String

        Dim FilePath As String = HttpContext.Current.Request.MapPath("YourFile.csv")

        fr = New System.IO.StreamReader(FilePath)

        While fr.Peek <> -1
            FileString = fr.ReadLine.Trim

            If String.IsNullOrEmpty(FileString) Then Continue While 'Empty Line

            LineItemsArr = FileString.Split(",")

            For Each Item as String In LineItemsArr
                'If every item will have a beginning and closing " (quote) then you can just
                'cut the first and last characters of the string here.
                'i.e.  UpdatedItems = Item. remove first and last character

                'Then stick the data into your Generic List (Of String()?)
            Next
        End While
0
ответ дан 28 November 2019 в 22:08
поделиться

Попробуйте этот сайт. http://kbcsv.codeplex.com/

Я искал хорошую утилиту, и это, безусловно, лучшее, что я нашел, и работает правильно. Не тратьте время попусту, пробуя что-то другое, это бесплатно и работает.

11
ответ дан 28 November 2019 в 22:08
поделиться

Как говорится в этой ссылке ... Не запускайте собственный анализатор CSV!

Используйте TextFieldParser, как предложил Avi. Microsoft уже сделала это за вас. Если вы закончили писать один и нашли в нем ошибку, подумайте о его замене, а не исправлении. Я сделал это недавно, и это сэкономило мне много времени.

7
ответ дан 28 November 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: