Как найти и заменить шаблон, такой как кавычки, окружающие "West"
в приведенном ниже примере файла CSV?Как найти и заменить элемент в CSV
"LastName","FirstName","","","890","","6G","","S "West" AVENUE","","CITY","ZIP"
Как найти и заменить шаблон, такой как кавычки, окружающие "West"
в приведенном ниже примере файла CSV?Как найти и заменить элемент в CSV
"LastName","FirstName","","","890","","6G","","S "West" AVENUE","","CITY","ZIP"
Вы не можете использовать 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 и использует удвоенную двойную кавычку вокруг строки.
Хороший ответ. Мне особенно понравилось ваше второе предложение. На самом деле это корень многих проблем, а не только в кодировании, а в жизни вообще. –
LOL. Благодарю. Просто назову это, как я вижу. И я видел это слишком много раз. –
Удивительный ответ! Спасибо! Кажется, сейчас работает – user3839012
Каков результат этого: 'CSV.foreach ('your_file.csv') do | row | p row end' Вы можете разместить только первые несколько строк. – 7stud
Нам нужно знать, что вы пробовали. –
Возможный дубликат [Замена текста в одном столбце CSV с использованием FasterCSV] (http://stackoverflow.com/questions/4430903/replacing-text-in-one-csv-column-using-fastercsv) –