#.net #regex #string
#.net #регулярное выражение #строка
Вопрос:
у меня есть следующая строка:
ID Table 1 Table 2
1 "Column 1 Column 2 Column 3
1 2 3
4 5 6
7 8 9" "Column A Column B Column C
a b c
d e f
g h i"
Первая строка содержит заголовки столбцов (ID, Table1 , таблица 2).
Вторая строка содержит данные.
Строка скопирована через буфер обмена с этого листа Excel: http://i.stack.imgur.com/5lwaT.png
Столбцы разделяются символом t, строка — символом r n. B2 и C2 — это таблицы. Ее столбцы и строка также разделены символами t и r n. Каждая таблица заключена в кавычки.
Теперь я разделяю строку:
Dim rows() as String
Regex = New Regex("rn")
rows = Regex.Split(MyString)
Это возвращает:
ID Table 1 Table 2
и
1 "Column 1 Column 2 Column 3
1 2 3
4 5 6
7 8 9" "Column A Column B Column C
a b c
d e f
g h i"
Теперь мне нужно разделить строки, но мне нужен шаблон, который возвращает каждую вкладку, которая не заключена в кавычки.
Кто-нибудь может мне помочь с регулярным выражением?
Спасибо 🙂
Комментарии:
1. вам действительно следует ознакомиться с этой статьей secretgeek.net/csv_trouble.asp
Ответ №1:
Поскольку я слишком устал, чтобы придумать хороший ответ, вместо этого приведу простой. Если вы можете быть уверены, что кавычки соединены, вы могли бы легко взломать это в три шага:
- Найдите вкладки, заключенные в кавычки, и поменяйте их местами.
- Разбить на вкладки
- Верните настоящие вкладки обратно.
Вот так:
// JS psuedo-code
str = str.replace( /("[^"]*)t([^"]*")/g, '$1ëïÒ$2' );
pieces = str.split( /t/ );
for (var i=0,len=pieces.length;i<len; i){
pieces[i] = pieces[i].replace( /ëïÒ/g, "t" );
}
Ужасная часть взлома заключается в использовании строки замены, которая, как вы можете надеяться, никогда не возникнет естественным образом.
Ответ №2:
Что вы пытаетесь сделать, так это создать свой анализатор CSV (в вашем случае замените запятую на tab). Есть отличная статья о том, почему вы не должны этого делать: http://secretgeek.net/csv_trouble.asp Однажды я попытался написать свой собственный анализатор, но затем остановился, потому что это действительно не так просто. Проверьте это бесплатное выражение. Это сэкономило мне пару часов.
Комментарии:
1. Пока оно соответствует правильному синтаксису, синтаксический анализатор не слишком сложен. Проблема в том, что большинство пользователей, экспортирующих в CSV, не знают об оговорках (заключает строки-запятые в кавычки, экранирует кавычки внутри кавычек, заключает многострочные значения в кавычки и т.д.)
2. @Брэд Кристи это отнимает время, которое можно легко сэкономить.
Ответ №3:
Я использую это для своих CSV-файлов, но следует, с некоторыми незначительными изменениями, заставить его работать и с разделителями табуляции:
Regex rExp = new Regex(@"(?:^|x09)(""(?:[^""] |"")*""|[^x09]*)");
И для справки, регулярное выражение в формате CSV:
Regex rExp = new Regex(@"(?:^|,)(""(?:[^""] |"""")*""|[^,]*)");
Пожалуйста, не делайте этого, чтобы также захватить окружающие кавычки.
Редактировать
Возможно, я слишком много предполагаю, но похоже, что вы пытаетесь получить значения и запутываетесь в разделителе. Это позволит зафиксировать значения внутри разделителей.
EDITv2
Используются дословные строки
Комментарии:
1. как насчет использования дословных строк? это значительно сократит количество символов в строке
2. Это более удовлетворительно? 😉