2014-09-26 3 views
0

Как найти и заменить шаблон, такой как кавычки, окружающие "West" в приведенном ниже примере файла CSV?Как найти и заменить элемент в CSV

"LastName","FirstName","","","890","","6G","","S "West" AVENUE","","CITY","ZIP" 
+1

Каков результат этого: 'CSV.foreach ('your_file.csv') do | row | p row end' Вы можете разместить только первые несколько строк. – 7stud

+0

Нам нужно знать, что вы пробовали. –

+0

Возможный дубликат [Замена текста в одном столбце CSV с использованием FasterCSV] (http://stackoverflow.com/questions/4430903/replacing-text-in-one-csv-column-using-fastercsv) –

ответ

3

Вы не можете использовать the CSV class, чтобы прочитать это, потому что это неправильный формат строки CSV. Иногда это происходит потому, что тот, кто ее сгенерировала не знали, что они делают:

require 'csv' 
foo = '"LastName","FirstName","","","890","","6G","","S "West" AVENUE","","CITY","ZIP"' 
arr_of_arrs = CSV.parse(foo) 

Который затем приводит к исключению:

Missing or stray quote in line 1 (CSV::MalformedCSVError) 

Вместо того, чтобы справиться с этим, вы должны зафиксировать вверх данных, затем проанализируйте. Вот отправная точка:

/(?<=\s)("[^"]+")(?=\s)/ 

http://rubular.com/r/sWEkx07Zyo

Узор ищет что-то между кавычками, обматывают начальные и конечные пробелы. Пробелы не захватываются.

Вот код, который работал бы на этом конкретном примере:

foo = '"LastName","FirstName","","","890","","6G","","S "West" AVENUE","","CITY","ZIP"' 

REGEX = /(?<=\s)("[^"]+")(?=\s)/ 

word = foo[REGEX] 
foo[REGEX] = word[1..-2] 
puts foo 
# >> "LastName","FirstName","","","890","","6G","","S West AVENUE","","CITY","ZIP" 

На данный момент CSV могут быть использованы:

require 'csv' 
arr_of_arrs = CSV.parse(foo) 
# => [["LastName", 
#  "FirstName", 
#  "", 
#  "", 
#  "890", 
#  "", 
#  "6G", 
#  "", 
#  "S West AVENUE", 
#  "", 
#  "CITY", 
#  "ZIP"]] 

Этот материал может быть запутанным:

word = foo[REGEX] 
foo[REGEX] = word[1..-2] 

foo\[...\] is part of the String class, и является удобным и удобным способом поиска и замены символов в строке.


Можно получить парсер CSV, чтобы быть счастливым с вложенными кавычками, так что если выбросить их слишком тяжелыми руками, вы можете сделать что-то вроде:

word = foo[REGEX] 
foo[REGEX] = '"%s"' % word 

require 'csv' 
arr_of_arrs = CSV.parse(foo) 
# => [["LastName", 
#  "FirstName", 
#  "", 
#  "", 
#  "890", 
#  "", 
#  "6G", 
#  "", 
#  "S \"West\" AVENUE", 
#  "", 
#  "CITY", 
#  "ZIP"]] 

который просто играет на правила спецификации CSV и использует удвоенную двойную кавычку вокруг строки.

+0

Хороший ответ. Мне особенно понравилось ваше второе предложение. На самом деле это корень многих проблем, а не только в кодировании, а в жизни вообще. –

+0

LOL. Благодарю. Просто назову это, как я вижу. И я видел это слишком много раз. –

+0

Удивительный ответ! Спасибо! Кажется, сейчас работает – user3839012