Linq Split функция Query - PullRequest
       1

Linq Split функция Query

2 голосов
/ 12 октября 2011

У меня есть CSV-файл, который содержит следующие записи:

Col1, Col2, Col3

«Тест, Тест1», 1,3

Ниже приведен запрос Linq, который разбивает документ csv в XML. Однако для приведенного выше примера он разделяет «Test, Test1» на два отдельных элемента.

var xml = new XElement("Root", source.Select(x => 
    new XElement("Testing", x.Split(splitChar).Select((Field, index) => 
        new XElement("Field" + index, Field)))).Skip(1));

Это генерирует что-то вроде:

<Root>
<Testing Field0="Test" Field01="Test1" Field02="1" Field03="3" />

</Root>

Но я хочу вот что:

<Root>
<Testing Field0="Test,Test1" Field01="1" Field02="3" />

</Root>

Может кто-нибудь, пожалуйста, помогите мне достичь выше?

1 Ответ

1 голос
/ 12 октября 2011

Вместо этого:

x.Split(splitChar)

попробуйте этот подход с помощью регулярного выражения:

Regex.Matches(x, "\"[^\"]*\"|[^,]+").Cast<Match>().Select(m => m.Value)

Это соответствует либо поле в кавычках, например: "foobar,baz" или то, что не содержит запятой.

В моем ответе есть некоторые ограничения:

  • Он не обрабатывает экранированные кавычки внутри строки, например, в этом случае: "Test1,Test\"two\",Test3",0,1. Вам это нужно?
  • Разделитель больше не является параметром, а жестко запрограммирован. Вы должны быть осторожны, так как некоторые символы являются специальными и должны быть экранированы в регулярном выражении. Попробуйте использовать Regex.Escape, если вы хотите построить регулярное выражение на основе значения времени выполнения splitChar.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...