У меня есть два CSV файла, каждый из которых содержит разные столбцы, которые я хочу объединить в одну базу данных. Я создал базу данных со всеми столбцами из обоих файлов, но когда я использую load data infile для импорта обоих файлов вместо слияния (файл данных IE 1 заполняет столбцы 1-6, файл данных 2 заполняет 7-10), я получаю базу данных с вдвое большим количеством строк (одна строка для каждой записи в каждом CSV) и NULLS, заполняющая данные, не представленные в исходном CSV.
Я знаю, что могу исправить это, объединив CSV каким-то образом, импортировав с включенной перезаписью или объединив данные в базе данных - что наиболее эффективным способом для меня это сделать?
Лучший способ сделать это - с помощью script. Сценарии импорта CSV обычно записываются на языке сценариев, таком как python, ruby или php.
Вам просто нужен импортер для второго CSV для выполнения обновлений записей, созданных в первом CSV, поэтому script будет действительно только 5-10 строк. Если вы предоставите образец записи из каждого CSV, я был бы рад написать для вас.
Изменить: Здесь python script, чтобы объединить файлы, добавив точку с запятой между строками из файла1 и строками из файла2. В основном это делает команда Linux paste
.
lines1 = open('file1.txt').readlines()
lines2 = open('file2.txt').readlines()
outfile = open('outfile.txt', 'w')
if len(lines1) != len(lines2):
raise Exception("Files need to be the same length, but file1 is %s lines long and file2 is %s lines long" % (len(lines1), len(lines2)));
for i in range(len(lines1)):
combined = lines1[i].strip() + ";" + lines2[i].strip() + "\n"
outfile.write(combined)
Вы можете запустить его, сохранив его как combine.py
и набрав python combine.py
. Папка, в которую вы помещаете ее, должна содержать file1.txt
, file2.txt
и outfile.txt
.
Объедините два CSV в один.
Если вы используете платформу linux, используйте команду paste
для объединения двух или более файлов.
PASTE(1) NAME paste - merge lines of files SYNOPSIS paste [OPTION]... [FILE]... DESCRIPTION Write lines consisting of the sequentially corresponding lines from each FILE, separated by TABs, to standard output. With no FILE, or when FILE is -, read standard input. Mandatory arguments to long options are mandatory for short options too. -d, --delimiters=LIST reuse characters from LIST instead of TABs -s, --serial paste one file at a time instead of in parallel --help display this help and exit --version output version information and exit
таких как
paste file1.csv file2.csv > file3.csv
Я бы посмотрел на Perl и Text:: CSV. Одна из проблем, о которых вам нужно подумать, заключается в том, находятся ли данные в одном порядке в двух файлах.