LINUX.ORG.RU

Регулярное выражение для парсинга CSV файлов

 


1

2

Всем привет.

Помогите составить регулярное выражение.

Нужно распарсить csv файл, вот пример:

$ cat data.csv 
One "Two Three" Four
"Five Six Seven" "Eight Nine" "Ten Eleven"
Twelve Thirteen Fourteen

Разделитель - пробел. В цикле читаю каждую линию, потом регуляркой выделяю нужную запись. Проблема в том, что есть записи в двойных кавычках, и в них тоже есть пробелы, и они все портят. Нужно как-то объяснить, что разделители (пробелы) в двойных кавычках нужно игнорировать. Как это сделать?

Вот мой незамысловатый код, который выделяет вторую запись (PHP, запускаю из консоли):

<?
	$string='Twelve Thirteen Fourteen';
	$pattern='/(\S+)\s(\S+).*/i';
	$replacement='$2';
	$result=preg_replace($pattern,$replacement,$string);
	echo "$result\n";
?>

Ответ можете давать на любом из популярных языков (программирования), хоть через grep/sed; здесь важна сама регулярка.

Заранее спасибо!

★★★★★

$ perl -pe 's/("[^"]*+"|[^"\s]\S*+)/<$1>/g' data.csv
<One> <"Two Three"> <Four>
<"Five Six Seven"> <"Eight Nine"> <"Ten Eleven">
<Twelve> <Thirteen> <Fourteen>
$ _
arsi ★★★★★
()
Ответ на: комментарий от arsi

Прикольно. Работает. Спасибо!

Kroz ★★★★★
() автор топика

если уж php используете то почему не использовать fgetcsv() ?

anthill
()

csv файл

Разделитель - пробел

Вы уж определитесь.

akk ★★★★★
()
Ответ на: комментарий от anonymous

anthill, akk,
спасибо, конечно, за советы по поводу библиотек CSV в PHP, но целью было именно регулярное выражение. Пример был сильно упрощен; на самом деле это файл экспортированный одной (enterprise) тулзовиной; файл - далеко не таблица и уж точно не CSV, и такого вида строка - это только одна из записей. И парсится это все bash скриптом. Понятие CSV и PHP были использованы лишь для облегчения понимания. Полученное регулярное выражение было адаптировано под реальную задачу и успешно применено. Так что всем спасибо, особенно arsi. Тема закрыта.

Kroz ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.