Разбивать строку через запятую, только когда запятая находится вне двойных кавычек c #

1
"TIMESTAMP (UTC)","LOG TYPE","DEVICE TYPE","DEVICE","MESSAGE","PARAMETERS"
"2014-08-12 17:30:34.437","Warning","DiverGate","141403G00294","Diver gate(s) did not connect since","2014-08-08 06:37:31 (UTC)"
"2014-08-12 17:30:34.577","Warning","DiverGate","141403G00120","Diver gate(s) did not connect since","2014-08-08 06:46:22 (UTC)"
"2014-08-13 06:45:18.890","Error","DiverGate","141403G00294","Was set to inactive, because it did not connect since","2014-08-08 06:37:31 (UTC)"
"2014-08-13 07:00:18.903","Error","DiverGate","141403G00120","Was set to inactive, because it did not connect since","2014-08-08 06:46:22 (UTC)"

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

 string url = @"E:\Project.csv";
 Stream stream = File.Open(url, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            string[] lines = null;

            using (StreamReader sr = new StreamReader(stream))
            {
                string str = sr.ReadToEnd();
                lines = Regex.Split(str, //what expression is going here);
            }
Теги:

4 ответа

2
Лучший ответ

Вы можете попробовать с Lookaround

Они не consume символы в строке, а только утверждают, возможно ли match или нет.

(?<="),(?=")

Здесь онлайн-демонстрация и тестирование в regexstorm

Объяснение шаблона очень простое

  (?<=                     look behind to see if there is:
    "                        '"'
  )                        end of look-behind
  ,                        ','
  (?=                      look ahead to see if there is:
    "                        '"'
  )                        end of look-ahead
  • 0
    Это здорово, но у меня есть еще одна проблема. Когда это доходит до конца одной строки (у меня это в данном случае 4), я получаю \"PARAMETERS\"\r\n\"2014-08-12 17:30:34.437\"" . Я понимаю, что означает \ r \ n \, но как вместо этого \ r \ n \ i поместить весь текст прямо из \ r \ n \ в новую строку?
  • 0
    regexstorm Это как в моем массиве строк. Каждый четвертый индекс выглядит так
3

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

Вы можете легко включить это в свой проект с помощью консоли диспетчера пакетов и ввода:

Install-Package CsvHelper

1

Эй, вы также можете использовать это регулярное выражение

var result = Regex.Split(samplestring, ",(?=(?:[^']*'[^']*')*[^']*$)");
1

Вместо развертывания собственного анализатора CSV используйте существующие библиотеки. Существует класс TextFieldParser, доступный с Visual Basic, просто добавьте ссылку на Microsoft.VisualBasic соответствии с проектной документацией, тогда вы можете сделать:

TextFieldParser textFieldParser = new TextFieldParser(@"E:\Project.csv");
textFieldParser.TextFieldType = FieldType.Delimited;
textFieldParser.SetDelimiters(",");
while (!textFieldParser.EndOfData)
{
    string[] values = textFieldParser.ReadFields();
    Console.WriteLine(string.Join("---", values));//printing the row
}
textFieldParser.Close();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню