Как я обрабатываю разрывы строки в файле CSV с помощью C#?

В одной строке javascript:

var isMobile = ('ontouchstart' in document.documentElement && navigator.userAgent.match(/Mobi/));

Если пользовательский агент содержит «Mobi» (согласно MDN) и ontouchstart доступен, то, скорее всего, это будет мобильное устройство.

12
задан Pranav Singh 28 March 2017 в 06:19
поделиться

13 ответов

В CSV есть предопределенные способы обработки этого. Этот сайт предоставляет легко читаемое объяснение стандартного способа обработки всех предостережений CSV .

Тем не менее, действительно нет причин не использовать надежную библиотеку с открытым исходным кодом для чтения и записи CSV файлы, чтобы не допускать нестандартных ошибок. LINQtoCSV - моя любимая библиотека для этого. Он поддерживает чтение и запись простым и понятным способом.

В качестве альтернативы этот вопрос SO о библиотеках CSV предоставит вам список наиболее популярных вариантов.

15
ответ дан 2 December 2019 в 05:04
поделиться

Вместо того, чтобы проверять, отсутствует ли в текущей строке (") в качестве первого символа, вместо этого проверьте, является ли последний символ ("). Если это не так, вы знаете, что у вас есть разрыв строки, и вы можете прочитать следующую строку и объединить ее.

Я предполагаю, что данные вашего примера были точными - поля были заключены в кавычки. Если кавычки могут не ограничивать текстовое поле (или новые строки каким-то образом обнаруживаются в нетекстовых данных), тогда все ставки отключены!

5
ответ дан 2 December 2019 в 05:04
поделиться

Я недавно использовал этот фрагмент кода для анализа строк из файла CSV (это упрощенная версия):

private void Parse(TextReader reader)
    {
        var row = new List<string>();
        var isStringBlock = false;
        var sb = new StringBuilder();

        long charIndex = 0;
        int currentLineCount = 0;

        while (reader.Peek() != -1)
        {
            charIndex++;

            char c = (char)reader.Read();

            if (c == '"')
                isStringBlock = !isStringBlock;

            if (c == separator && !isStringBlock) //end of word
            {
                row.Add(sb.ToString().Trim()); //add word
                sb.Length = 0;
            }
            else if (c == '\n' && !isStringBlock) //end of line
            {
                row.Add(sb.ToString().Trim()); //add last word in line
                sb.Length = 0;

                //DO SOMETHING WITH row HERE!

                currentLineCount++;

                row = new List<string>();
            }
            else
            {
                if (c != '"' && c != '\r') sb.Append(c == '\n' ? ' ' : c);
            }
        }

        row.Add(sb.ToString().Trim()); //add last word

        //DO SOMETHING WITH LAST row HERE!
    }
2
ответ дан 2 December 2019 в 05:04
поделиться

Возможно, вы могли бы посчитать (") во время ReadLine (). Если они нечетные, это поднимет флаг. Вы можете либо игнорировать эти строки, либо получить следующие две и исключить первое "\ n" вхождение строк слияния.

1
ответ дан 2 December 2019 в 05:04
поделиться

Обычно я читаю текст посимвольно, а не построчно, из-за этой самой проблемы.

Когда вы читаете каждый символ, вы должны быть в состоянии выяснить, где каждая ячейка начинается и заканчивается, а также различие между разрывом строки в строке и в ячейке: если я правильно помню, для файлов, сгенерированных Excel, в любом случае строки начинаются с \ r \ n, а новые строки в ячейках только \ r.

1
ответ дан 2 December 2019 в 05:04
поделиться

Прислушайтесь к советам экспертов и Не используйте собственный анализатор CSV .

Ваша первая мысль: «Как мне поступить? новые разрывы строк? »

Ваша следующая мысль:« Мне нужно обрабатывать запятые внутри кавычек ».

Следующая ваша мысль будет:« О, дерьмо, мне нужно обрабатывать кавычки внутри кавычек. Экранированные кавычки. Двойные кавычки. Одинарные кавычки ... »

Это дорога к безумию. Не пишите свои собственные. Найдите библиотеку с обширным охватом модульного тестирования, которая затрагивает все сложные моменты и прошла через ад за вас. Для .NET используйте бесплатную библиотеку FileHelpers .

1
ответ дан 2 December 2019 в 05:04
поделиться

Существует пример синтаксического анализатора на C #, который, кажется, правильно обрабатывает ваш случай. Затем вы можете прочитать свои данные и удалить из них разрывы строк после чтения. Часть 2 - это синтаксический анализатор, а есть Часть 1 , которая охватывает часть записи.

0
ответ дан 2 December 2019 в 05:04
поделиться

Прочитать строку.
Разбить на столбцы (поля).
Если для каждой строки ожидается достаточное количество столбцов, обработайте.
Если нет, прочтите следующую строку и запишите оставшиеся столбцы, пока не получите то, что вам нужно.
Повторите.

0
ответ дан 2 December 2019 в 05:04
поделиться

В каждой строке можно использовать несколько простое регулярное выражение. Когда он совпадает, вы обрабатываете каждое поле из совпадения. Если совпадение не найдено, вы пропускаете эту строку.

Регулярное выражение может выглядеть примерно так.

Match match = Regex.Match(line, @"^(?:,?(?<q>['"](?<field>.*?\k'q')|(?<field>[^,]*))+$");
if (match.Success)
{
  foreach (var capture in match.Groups["field"].Captures)
  {
    string fieldValue = capture.Value;
    // Use the value.
  }
}
0
ответ дан 2 December 2019 в 05:04
поделиться

Взгляните на Библиотеку FileHelpers Он поддерживает чтение \ запись CSV с разрывами строк, а также чтение \ запись в Excel

0
ответ дан 2 December 2019 в 05:04
поделиться

Решение LINQy:

string csvText = File.ReadAllText("C:\\Test.txt");

var query = csvText
    .Replace(Environment.NewLine, string.Empty)
    .Replace("\"\"", "\",\"").Split(',')
    .Select((i, n) => new { i, n }).GroupBy(a => a.n / 3);
0
ответ дан 2 December 2019 в 05:04
поделиться

Существует встроенный метод для чтения файлов CSV в .NET (требуется добавление ссылки на сборку Microsoft.VisualBasic):

public static IEnumerable<string[]> ReadSV(TextReader reader, params string[] separators)
{
    var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(reader);
    parser.SetDelimiters(separators);
    while (!parser.EndOfData)
        yield return parser.ReadFields();
}

Если вы имеете дело с действительно большими файлами, это Считыватель CSV утверждает, что он самый быстрый из тех, что вы найдете: http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader

3
ответ дан 2 December 2019 в 05:04
поделиться

Попробуйте CSVHelper (библиотека, которую я поддерживаю). Он игнорирует пустые строки. Я считаю, что есть флаг, который вы можете установить в FastCSVReader, чтобы он также обрабатывал пустые строки.

2
ответ дан 2 December 2019 в 05:04
поделиться
Другие вопросы по тегам:

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