Вопрос

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

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

Это было полезно?

Решение

string[] splitString = origString.Split(',');

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

Другие советы

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

using System.Text.RegularExpressions;

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

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

Если вам нужна надежная обработка CSV, ознакомьтесь с Помощники по работе с файлами

Попробуй:

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

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

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

Microsoft.VisualBasic.FileIO.TextFieldParser

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

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

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

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

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

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

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;
            }
        }
    }

}
CsvString.split(',');

Получаем строку[] из всех строк:

string[] lines = System.IO.File.ReadAllLines("yourfile.csv");

Затем выполните цикл и разделите эти строки (это чревато ошибками, поскольку не проверяется наличие запятых в полях, разделенных кавычками):

foreach (string line in lines)
{
    string[] items = line.Split({','}};
}
string s = "1,2,3,4,5";

string myStrings[] = s.Split({','}};

Обратите внимание, что функция Split() принимает массив из символов, на которых можно разделиться.

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

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

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

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

Он не использует кавычки..пока.Я просто собрала его несколько дней назад, чтобы унять зуд.

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

http://github.com/claco/csvdatareader/ обновлено с помощью TextFieldParser, предложенного cfeduke.

Всего в нескольких шагах от раскрытия разделителей / trimspaces / type ig вам просто нужно украсть код.

Я уже разбирался по вкладкам, так что это сработало за меня:

public static string CsvToTabDelimited(string line) {
    var ret = new StringBuilder(line.Length);
    bool inQuotes = false;
    for (int idx = 0; idx < line.Length; idx++) {
        if (line[idx] == '"') {
            inQuotes = !inQuotes;
        } else {
            if (line[idx] == ',') {
                ret.Append(inQuotes ? ',' : '\t');
            } else {
                ret.Append(line[idx]);
            }
        }
    }
    return ret.ToString();
}
string test = "one,two,three";
string[] okNow = test.Split(',');
separationChar[] = {';'}; // or '\t' ',' etc.
var strArray = strCSV.Split(separationChar);
string[] splitStrings = myCsv.Split(",".ToCharArray());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top