Perl и регулярные выражения для спасения.Копаясь в SO и играя с регулярными выражениями здесь , не сложно придумать правильный вариант:
s/(\"[^\",]+),([^\"]+\")/$1_$2/g
, который соответствует "...,..."
, здесь точки совсем не двойныекавычки и запятые, и заменяет запятую подчеркиванием.Однострочный Perl - это правильный фильтр для передачи в sqldf:
x <- read.csv.sql("temp.csv",
filter = "perl -e 's/(\"[^\",]+)_([^\"]+\")/$1_$2/g'",
header=FALSE)
Вот кадр данных x
> x
V1 V2 V3 V4
1 1001 Amy 9:43:00 99.2
2 1002 "Ben_Jr" 9:43:00 99.2
3 1003 "Ben_Sr" 9:44:00 99.3
Теперь космодез DYO для строк ...
РЕДАКТИРОВАТЬ : приведенное выше регулярное выражение заменяет только первое вхождение запятой в поле.Для замены всех случаев используйте это
s{(\"[^\",]+),([^\"]+\")}{$_= $&, s/,/_/g, $_}eg
Что отличается?
- Я заменил разделители
/
на {}
; - Опция e в самом конце указывает синтаксическому анализатору интерпретировать поле замены как код perl;
- Повторение - это простая замена регулярного выражения, которая заменяет все "
,
" на "_
" в соответствующей подстроке $&
.
Пример:
system("touch temp.csv")
system("echo '1001, Amy,9:43:00, 99.2\n1002,\"Ben,Jr,More,Commas\",9:43:00, 99.2\n1003,\"Ben,Sr\",9:44:00, 99.3' > temp.csv")
Файл temp.csv выглядит так:
1001, Amy,9:43:00, 99.2
1002,"Ben,Jr,More,Commas",9:43:00, 99.2
1003, "Ben,Sr",9:44:00, 99.3
И может быть прочитан с помощью
x <- read.csv.sql("temp.csv",
filter = "perl -p -e 's{(\"[^\",]+),([^\"]+\")}{$_= $&, s/,/_/g, $_}eg'",
header=FALSE)
> x
V1 V2 V3 V4
1 1001 Amy 9:43:00 99.2
2 1002 "Ben_Jr_More_Commas" 9:43:00 99.2
3 1003 "Ben_Sr" 9:44:00 99.3