регулярное выражение для разделения строки (CSV-файл) - PullRequest
7 голосов
/ 17 июля 2010

Я не хорош в регулярных выражениях. Может ли кто-нибудь помочь мне написать регулярное выражение для меня?

У меня могут быть такие значения при чтении CSV-файла.

"Artist,Name",Album,12-SCS
"val""u,e1",value2,value3

Выход:

Artist,Name  
Album
12-SCS
Val"u,e1 
Value2 
Value3

Обновление: Мне нравится идея с использованием провайдера Oledb. У нас есть контроль загрузки файлов на веб-странице, поэтому я читаю содержимое файла с помощью потокового считывателя без фактического сохранения файла в файловой системе. Можно ли каким-либо образом использовать поставщика Oledb, потому что нам нужно указать имя файла в строке подключения, и в моем случае файл не сохраняется в файловой системе.

Ответы [ 7 ]

14 голосов
/ 24 апреля 2012

Просто добавляю решение, над которым я работал сегодня утром.

var regex = new Regex("(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)");

foreach (Match m in regex.Matches("<-- input line -->"))
{
    var s = m.Value; 
}

Как видите, вам нужно вызвать regex.Matches () на строку . Затем он вернет MatchCollection с тем же количеством элементов, что и у вас, как в столбцах. Свойство Value каждого совпадения, очевидно, является проанализированным значением.

Эта работа еще не завершена, но она, к счастью, анализирует строки CSV, например:

2,3.03,"Hello, my name is ""Joshua""",A,B,C,,,D
8 голосов
/ 08 апреля 2011

На самом деле, довольно просто сопоставить строки CVS с регулярным выражением.Попробуйте:данные, но логика кода C # не проверена.(У меня нет доступа к инструментам C #.)

6 голосов
/ 17 июля 2010

Regex не подходит для этого. Используйте CSV парсер . Либо встроенный один или сторонний один.

5 голосов
/ 17 июля 2010

Посмотрите на класс TextFieldParser . Он находится в сборке Microsoft.VisualBasic и выполняет синтаксический анализ с разделителями и фиксированной шириной.

1 голос
/ 08 апреля 2011

Дайте CsvHelper попробовать (библиотека, которую я поддерживаю). Это доступно через NuGet.

Вы можете легко прочитать файл CSV в коллекцию пользовательских классов. Это также очень быстро.

var streamReader = // Create a StreamReader to your CSV file
var csvReader = new CsvReader( streamReader );
var myObjects = csvReader.GetRecords<MyObject>();
0 голосов
/ 11 мая 2017

Это можно сделать, используя следующий код:

using Microsoft.VisualBasic.FileIO;
string csv = "1,2,3,"4,3","a,"b",c",end";
TextFieldParser parser = new TextFieldParser(new StringReader(csv));
//To read from file
//TextFieldParser parser = new TextFieldParser("csvfile.csv");
parser.HasFieldsEnclosedInQuotes = true;
parser.SetDelimiters(",");
string[] fields =null;
while (!parser.EndOfData)
{
    fields = parser.ReadFields();
}
parser.Close();
0 голосов
/ 17 июля 2010

Regex может быть слишком сложным здесь. Разбейте строку на запятые, а затем переберите получившиеся биты и объедините их, если «количество двойных кавычек в объединенной строке» не является четным.

"Привет, это", есть, "a" "test" ""

... разделить ...

"привет | это" | это | "a" "test" ""

... повторять и объединять до четного числа двойных кавычек ...

«Привет, это» - четное количество кавычек (запятая записка удаляется путем разделения на биты)

- четное количество кавычек

"a" "test" "" - четное количество кавычек

... затем полосу лидирующих и конечных кавычек, если они есть, и заменить "" на ".

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