Разделитель заключен в текст в некоторых ячейках - PullRequest
0 голосов
/ 03 июля 2018

Я делаю Программное обеспечение, которое должно читать много данных из файла CSV. Файл CSV использует ';' в качестве разделителя. Недавно я узнал, что текст в некоторых ячейках также завершается символом «;». Каждый кортеж из файла является объектом, и поэтому каждая ячейка в этой строке является атрибутом этого объекта. Я использую метод Split в C #, который возвращает массив строк. Из-за ';' в некоторых ячейках я получаю сообщение об ошибке: массив вышел за пределы. Существуют ли способы избавиться от этой ошибки, не удаляя ';' из каких ячеек?

Пример для такого кортежа:

Cell1; CELL2; CELL3; stillCell3; cell4;

Cell3; stillCell3 - это одна ячейка, но метод Split этого не знает.

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Вы можете попробовать TextFieldParser , у него есть много опций для чтения полей.

using (TextFieldParser lcsvReader = new TextFieldParser(new MemoryStream(<FILE_BYTES>), Encoding.Default))
{
    lcsvReader.Delimiters = new string[2] { ",", "\t" };
    lcsvReader.HasFieldsEnclosedInQuotes = true;
    lcsvReader.TrimWhiteSpace = true;
    while (!lcsvReader.EndOfData)
    {
        string[] fields = lcsvReader.ReadFields();
        //fields -- Actual field in CSV
    }
    lcsvReader.Close();
}
0 голосов
/ 03 июля 2018

Ваши исходные данные не соответствуют требованиям формата файла CSV. Ни один парсер не может справиться с проблемами, о которых люди почесывают голову.

Вы не можете анализировать неоднозначные значения. Вы должны либо экранировать разделители в значениях полей, либо помещать значения в двойные кавычки.

0 голосов
/ 03 июля 2018

Вы можете избежать этих значений, вставив поле в набор двойных кавычек. Для более подробной информации вы можете обратиться по этой ссылке

Формат файла CSV

------------ РЕДАКТИРОВАТЬ 1 ---------------------

Рассмотрим этот пример. Это запятая csv

enter image description here

Здесь вы можете увидеть столбец «ОК, 123; asw.wew» с ',' и ';'

Если мы откроем его с помощью блокнота или текстового редактора, мы увидим, что к нему автоматически добавляется escape-символ.

enter image description here

Вы должны кодировать таким образом, чтобы он разделялся на разделитель, а не на двойные кавычки.

-------------------------- РЕДАКТИРОВАТЬ 2 ---------------- ----------

Вы можете воспользоваться .net классом TextFieldParser. Чтобы использовать его

  • добавить ссылку на Microsoft.VisualBasic (да, там написано VisualBasic, но она работает и в C #)
  • использовать класс Microsoft.VisualBasic.FileIO.TextFieldParser для разбора CSV файла

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

using (TextFieldParser parser = new TextFieldParser(@"c:\test.csv"))
{
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters(",");
    while (!parser.EndOfData) 
    {
        //Processing row
        string[] fields = parser.ReadFields();
        foreach (string field in fields) 
        {
            //TODO: Process field
        }
    }
}

Вот еще несколько полезных ссылок:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...