CSV строка разделена на строковый массив вопрос - PullRequest
1 голос
/ 21 августа 2010

Как бы вы разбили эту строку на строковый массив ?

проблема в Рутуа, а.с. , поэтому вы не можете напрямую разделить с помощью ',' разделитель ..

543472,"36743721","Rutois, a.s.","151","some name","01341",55,"112",1

спасибо

Ответы [ 6 ]

7 голосов
/ 21 августа 2010

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

FileHelpers - хорошая библиотека для этой работы.

6 голосов
/ 21 августа 2010

Вы можете использовать регулярное выражение, чтобы выбрать значения из строки:

string line ="543472,\"36743721\",\"Rutois, a.s.\",\"151\",\"some name\",\"01341\",55,\"112\",1";
var values = Regex.Matches(line, "(?:\"(?<m>[^\"]*)\")|(?<m>[^,]+)");
foreach (Match value in values) {
  Console.WriteLine(value.Groups["m"].Value);
}

Выход:

543472
36743721
Rutois, a.s.
151
some name
01341
55
112
1

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

1 голос
/ 21 августа 2010

вы можете подключиться к файлу с помощью odbc, проверьте эту

ссылку (если ссылка не очень помогает, просто перейдите по ссылке "соединение csv файлов с odbc")

Еслиу вас есть проблемы в odbc также я думаю, файл не является допустимым CSV-файлом.

0 голосов
/ 06 сентября 2013

Другой ответ RegEx потерпит неудачу, если первый символ является кавычкой.

Это правильное регулярное выражение:

string[] columns = Regex.Split(inputRow, ",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");
0 голосов
/ 22 августа 2010

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

        string csv = "543472,\"36743721\",\"Rutois, a.s.\",\"151\",\"some name\",\"01341\",55,\"112\",1"; 


        const string COMMA_TOKEN = "[COMMA]";
        string[] values;
        bool inQuotes = false;

        StringBuilder cleanedCsv = new StringBuilder();
        foreach (char c in csv)
        {
            if (c == '\"')
                inQuotes = !inQuotes;  //work out if inside a quoted string or not
            else
            {
                //Replace commas in quotes with a token
                if (inQuotes && c == ',')
                    cleanedCsv.Append(COMMA_TOKEN);
                else
                    cleanedCsv.Append(c);
            }
        }

        values = cleanedCsv.ToString().Split(',');

        //Put the commas back
        for (int i = 0; i < values.Length; i++)
            values[i] = values[i].Replace(COMMA_TOKEN, ",");
0 голосов
/ 21 августа 2010

Полагаю, вы хотите что-то вроде этого -

string csv = 543472,"36743721","Rutois, a.s.","151","some name","01341",55,"112",1 ;
string[] values;
values = csv.Split(",");
for(int i = 0; i<values.Length; i++)
{
    values[i] = values[i].Replace("\"", "");
}

Надеюсь, это поможет.

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