#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 - ""