Следующий perl работает в большинстве случаев:
open(DATA,'in/my.csv');
while(<DATA>){
if(/(,\s*|^)"[^"]*,[^"]*"(\s*,|$)/){
print "Before: $_";
while(/(,\s*|^)"[^"]*,[^"]*"(\s*,|$)/){
s/((?:^|,\s*)"[^"]*),([^"]*"(?:\s*,|$))/$1 $2/
}
print "After: $_";
}
}
Он ищет:
- (запятая плюс дополнительные пробелы) или начало строки
- цитата
- 0 или более не кавычек
- запятая
- 0 или более не кавычек
- (необязательные пробелы плюс запятая) или конец строки
Если найдено, он будет продолжать заменять запятую пробелом, пока не найдет больше примеров.
Это работает из-за предположения, что перед открывающей кавычкой будет стоять запятая плюс дополнительные пробелы (или будет в начале строки), а за закрывающей кавычкой будут следовать дополнительные пробелы плюс запятая или быть концом линии.
Я уверен, что есть случаи, когда это не удастся - если кто-то может опубликовать их, я бы очень хотел их увидеть ...