Импортируйте файлы csv, содержащие данные с запятыми, в MySQL

У меня есть файлы .csv размером более 10 ГБ. Я пытаюсь импортировать данные из этих файлов в MySQL, используя python. Поскольку файлы csv представляют собой файлы, разделенные запятыми, и у меня есть данные, которые сами содержат запятые, поэтому я не могу использовать здесь «,» для разделения. Там, пожалуйста, предложите другой вариант разделения файла csv. Я хочу импортировать данные из файла csv (где сами данные содержат запятую) в MySQL (для этого я использую сервер Wamp). У меня есть такие данные, как «Лондон, Великобритания», «2010», «кредит, сбережения».


person Jannat Arora    schedule 04.03.2012    source источник
comment
может быть, если вы предоставите пример данных, мы сможем что-нибудь придумать.   -  person hovanessyan    schedule 05.03.2012
comment
я предоставил пример данных в вопросе :)   -  person Jannat Arora    schedule 05.03.2012


Ответы (3)


Прежде всего, я предполагаю, что в CSV-файлах строковые значения заключены в кавычки.

Таким образом, каждое значение, содержащее запятую, заключено в такую ​​кавычку:

а, б, 2, 'фу, бар'

Если это так, то вы можете использовать следующее:

импорт

 csv

quoteChar = "'"

myReader = csv.reader(open('largefile.csv', 'rb'), delimiter=',', quoteChar = quoteChar)

for row in myReader:
    print row # this prints a list. Row is a list of values per line in your
    # 'largefile.csv' file. Each row is splitted on the delimiter char.
    # (comma in this case) and strings that are quoted by quoteChar (in your case
    # a ' are treated differently.) This will work for your input that you've given
    # in your question.

# this is what you used to do:
for line in open('largefile.csv', 'rb'):
     row = line.split(quoteChar)

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

person Daan Timmer    schedule 04.03.2012
comment
Спасибо за помощь. Поскольку мне также нужно перенести этот контент в базу данных MySQL, я делал следующее: для строки в myReader: values=row.split(',') и затем сохранял эти значения в MySQL. Этот раскол по существу вызывает проблему. Есть ли альтернативный способ передачи данных в MySQL - person Jannat Arora; 05.03.2012
comment
@ user869790: Даан показывает вам альтернативный способ. Встроенный в Python модуль csv — это то, что вам следует использовать для этой задачи. Не изобретайте заново то, что уже было создано и протестировано за вас. - person mechanical_meat; 05.03.2012
comment
@ user869790 Адам Бернье прав. Я обновил свой ответ, чтобы немного прояснить ситуацию. строка из myReader - это тот же (тип) "строка", которую вы получите после line.split(), но затем "лучше". Модуль CSV сделает все это за вас. Не нужно изобретать велосипед. - person Daan Timmer; 05.03.2012
comment
@AdamBernier Просто наивный вопрос, пожалуйста, простите меня, так как я новичок. Как проверить, какой у меня CSV-файл. Поскольку я запустил приведенный выше код и обнаружил, что мои данные не заключены в двойные кавычки, я также могу просмотреть файл в формате «xlsx». - person Jannat Arora; 05.03.2012
comment
@DaanTimmer Спасибо, ваш подход тоже сработал. Очень ценю вашу помощь - person Jannat Arora; 05.03.2012
comment
@AdamBernier Спасибо за помощь, подход сработал. Очень ценю вашу помощь - person Jannat Arora; 05.03.2012
comment
@ user869790 нет проблем. Другое решение более элегантно и, вероятно, быстрее. Мой больше связан с python (потому что у вас тоже были проблемы с разбором данных CSV). Рад, что был полезен :-) - person Daan Timmer; 05.03.2012

Был предоставлен хороший ответ для импорта с использованием Python. Но мне непонятно, зачем вам нужен Python для этого. MySQL имеет встроенные команды для импорта данных CSV — см. загрузить данные справочной страницы. Например,

LOAD DATA LOCAL INFILE 'source_data.csv'
INTO TABLE my_table
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
IGNORE 1 LINES;

Эта последняя часть игнорирует первую строку (используйте, если ваш файл CSV имеет «заголовок»).

person imm    schedule 04.03.2012
comment
Огромное спасибо за помощь. Но так как я новичок, я не знаю, заключен ли мой файл csv (который я просматриваю в xls) в кавычки, также мои данные имеют комментарии, поэтому я думаю, что в нем должны быть кавычки, данные такие же, как данные stackoverflows, которые я преобразовал в csv для хранения в базе данных. Не могли бы вы дать мне подсказку, чтобы я мог проверить закрывающий символ. Еще раз спасибо за помощь - person Jannat Arora; 05.03.2012
comment
@user869790 user869790, ну, необязательная часть указывает, что не всегда нужно заключать поле в двойные кавычки. Если вы хотите увидеть, что окружает ваши поля, вы можете открыть файл и просмотреть данные, прежде чем запускать для него команду LOAD. - person imm; 05.03.2012
comment
Спасибо еще раз за помощь. Есть ли хороший способ, с помощью которого я могу вводить записи, относящиеся только к некоторым годам, а не ко всем годам, как в наборе данных? - person Jannat Arora; 06.03.2012
comment
Используя этот подход, не напрямую. Я бы рекомендовал загрузить все это в одну таблицу, которую вы планируете выбросить, а затем использовать синтаксис CREATE TABLE .. SELECT для создания таблицы с данными, которые вам действительно нужны. См. dev.mysql.com/doc/refman/5.1/en /create-table.html - person imm; 06.03.2012

Вы можете использовать mysqlimport

mysqlimport --ignore-lines=1 --fields-terminated-by=, --fields-optionally-enclosed-by='"' --verbose --local -u root -p DB_Name csv/path.csv > save_log.log
person kamran kausar    schedule 15.07.2021