Разделите csv-файл, где разделитель также отображается в тексте

#c# #split

Вопрос:

Я должен разделить следующую строку из csv-файла

1111,»Название компании»,»Улица 70″,»Дом № 1, 1 Этаж, Комната 34″,Город,2213

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

 var values = line.Split(',');
 

Верхняя строка разрешена таким образом

 values[0] 1111 
values[1] "Company Name" 
values[2] "Street 70" 
values[3] "Building Nr.1
values[4] 1st Floor
values[5] Room 34"
values[6] City
values[7] 2213
 

но я должен был бы решить это таким образом

 values[0] 1111 
values[1] "Company Name" 
values[2] "Street 70" 
values[3] "Building Nr.1, 1st Floor, Room 34"
values[4] City
values[5] 2213
 

У кого-нибудь есть идея, как параметризовать разделение, чтобы оно работало

Ответ №1:

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

Я уже использовал CSVHelper раньше — это действительно хорошо.

https://joshclose.github.io/CsvHelper/

Если вы хотите запустить свой собственный, то вы можете посмотреть код для CSVHelper, хотя это довольно сложно:

https://github.com/JoshClose/CsvHelper/blob/master/src/CsvHelper/CsvParser.cs

Ответ №2:

Если кому-то не все равно. Нашел для меня следующее решение.

 var text = "";
var isCharInValue = false;
foreach (var currentChar in line)
{
    if (currentChar == '"')
    {
        if (isCharInValue == false)
        {
            isCharInValue = true;
        }
        else
        {
            isCharInValue = false;
        }
    }
    if (isCharInValue == true amp;amp; currentChar == ',')
    {
        text = text   ";;;;;;;;";
    }
    else
    {
        text = text   currentChar;
    }
}



var values = text.Split(',');

int xx1 = values.Length;
for (int i = 0; i < xx1; i  )
{
    values[i] = values[i].Replace(";;;;;;;;", ",");
}
 

Ответ №3:

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

Мы проходим через символы строки и разделяем их на элементы при нахождении символа-разделителя. Если мы сталкиваемся с символом в двойных кавычках, то в следующих символах мы игнорируем разделитель, после нахождения закрывающих двойных кавычек мы продолжаем разделять строку.

 static List<string> CustomStringSplit(string inputString, char splitChar)
{
    if (splitChar == '"')
        throw new Exception("Wrong split char");

    var result = new List<string>();
    var stringBuilder = new StringBuilder();
    var isCharInValue = false;
    foreach (var currentChar in inputString)
    {
        if (currentChar == splitChar amp;amp; !isCharInValue)
        {
            result.Add(stringBuilder.ToString());
            stringBuilder.Clear();
        }
        else if (currentChar == '"')
        {
            isCharInValue = !isCharInValue;
        }
        else
        {
            stringBuilder.Append(currentChar);
        }
    }
    result.Add(stringBuilder.ToString());

    return resu<
}
 

Например, строка (добавлены пустые элементы в начале и в конце):

 var inputString = """,1111,"Company Name","Street 70","Building Nr.1, 1st Floor, Room 34",City,2213,";
 

Мы получаем элементы:

 0 - ""
1 - "1111"
2 - "Company Name" 
3 - "Street 70" 
4 - "Building Nr.1, 1st Floor, Room 34"
5 - "City"
6 - "2213"
7 - ""