asp.net Конвертировать строку CSV в строку [] - PullRequest
7 голосов
/ 16 сентября 2008

Есть ли простой способ преобразовать строку из формата CSV в строку [] или список?

Я могу гарантировать, что в данных нет запятых.

Ответы [ 17 ]

17 голосов
/ 16 сентября 2008

String.Split просто не собирается его сокращать, но Regex.Split может - Попробуйте это:

using System.Text.RegularExpressions;

string[] line;
line = Regex.Split( input, ",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");

Где 'input' - это строка csv. Это будет работать с разделителями в кавычках и должно вернуть вам массив строк, представляющих каждое поле в строке.

8 голосов
/ 16 сентября 2008

Если вы хотите надежную обработку CSV, посмотрите FileHelpers

2 голосов
/ 16 сентября 2008

Вы можете взглянуть на использование сборки Microsoft.VisualBasic с

Microsoft.VisualBasic.FileIO.TextFieldParser

Он обрабатывает CSV (или любой разделитель) с кавычками. Я нашел это довольно удобным в последнее время.

2 голосов
/ 16 сентября 2008

Попробуйте:

Regex rex = new Regex(",(?=([^\"]*\"[^\"]*\")*(?![^\"]*\"))");
string[] values = rex.Split( csvLine );

Источник: http://weblogs.asp.net/prieck/archive/2004/01/16/59457.aspx

2 голосов
/ 16 сентября 2008
string[] splitString = origString.Split(',');

(Следующий комментарий не добавлен первоначальным ответчиком) Пожалуйста, имейте в виду, что этот ответ относится к ОСОБЕННОМУ случаю, когда в данных гарантированно нет запятых.

1 голос
/ 16 сентября 2008

Попробуйте это;

static IEnumerable<string> CsvParse(string input)
{
    // null strings return a one-element enumeration containing null.
    if (input == null)
    {
        yield return null;
        yield break;
    }

    // we will 'eat' bits of the string until it's gone.
    String remaining = input;
    while (remaining.Length > 0)
    {

        if (remaining.StartsWith("\"")) // deal with quotes
        {
            remaining = remaining.Substring(1); // pass over the initial quote.

            // find the end quote.
            int endQuotePosition = remaining.IndexOf("\"");
            switch (endQuotePosition)
            {
                case -1:
                    // unclosed quote.
                    throw new ArgumentOutOfRangeException("Unclosed quote");
                case 0:
                    // the empty quote
                    yield return "";
                    remaining = remaining.Substring(2);
                    break;
                default:
                    string quote = remaining.Substring(0, endQuotePosition).Trim();
                    remaining = remaining.Substring(endQuotePosition + 1);
                    yield return quote;
                    break;
            }
        }
        else // deal with commas
        {
            int nextComma = remaining.IndexOf(",");
            switch (nextComma)
            {
                case -1:
                    // no more commas -- read to end
                    yield return remaining.Trim();
                    yield break;

                case 0:
                    // the empty cell
                    yield return "";
                    remaining = remaining.Substring(1);
                    break;

                default:
                    // get everything until next comma
                    string cell = remaining.Substring(0, nextComma).Trim();
                    remaining = remaining.Substring(nextComma + 1);
                    yield return cell;
                    break;
            }
        }
    }

}
1 голос
/ 16 сентября 2008

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

Возможно, вы также захотите преобразовать строки в словарь, используя имя столбца.

Мой код для этого - несколько сотен строк.

Я думаю, что есть несколько примеров в Интернете, проектах с открытым исходным кодом и т. Д.

0 голосов
/ 16 сентября 2008

Csv-файл с полями Quoted, не является Csv-файлом. Гораздо больше вещей (Excel) выводится без кавычек, а не с кавычками, когда вы выбираете «Csv» при сохранении как.

Если вам нужен тот, который вы можете использовать, бесплатно или передать, вот мой, который также делает IDataReader / Record. Он также использует DataTable для определения / преобразования / применения столбцов и DbNull.

http://github.com/claco/csvdatareader/

Это не делает кавычки .. пока. Я просто бросил это вместе несколько дней назад, чтобы чесать зуд.

Забытая точка с запятой: Хорошая ссылка. Благодарю. cfeduke: Спасибо за совет Microsoft.VisualBasic.FileIO.TextFieldParser. Сегодня вечером отправляюсь в CsvDataReader.

0 голосов
/ 16 сентября 2008

Некоторые файлы CSV имеют двойные кавычки вокруг значений вместе с запятой. Поэтому иногда вы можете разделить этот строковый литерал: ","

0 голосов
/ 16 сентября 2008
string[] splitStrings = myCsv.Split(",".ToCharArray());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...