我有csv格式的IMDB数据。这是一张快照。
[root@jamatney IMDB]# head IMDBMovie.txt
id,name,year,rank
0,#28 (2002),2002,
1,#7 Train: An Immigrant Journey, The (2000),2000,
2,$ (1971),1971,6.4000000000000004
3,$1000 Reward (1913),1913,
4,$1000 Reward (1915),1915,
5,$1000 Reward (1923),1923,
6,$1,000,000 Duck (1971),1971,5
7,$1,000,000 Reward, The (1920),1920,
8,$10,000 Under a Pillow (1921),1921,
我想将这些数据导入MySQL数据库。但是,名称单元格中存在逗号。这可以防止我正确地将数据加载到数据库中,因为我的加载查询是
mysql> LOAD DATA LOCAL INFILE 'IMDB/IMDBMovie.txt' INTO TABLE Movie FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;
我考虑过使用rev
和cut
的某种组合来隔离有问题的列,然后查找/替换逗号,但似乎无法使其工作。想知道这是否是正确的方法,或者是否有更好的方法。
答案 0 :(得分:2)
看起来第一个字段和最后两个字段都是明确的,所以你要做的就是编写一个脚本来将它们拉出来,然后用引号括起来。我的bash-fu还不够用rev
和cut
来完成它,但是我能够编写一个Python脚本来完成它。您可以在OPTIONALLY ENCLOSED BY
查询中添加LOAD DATA
子句。
f = open("IMDBMovie.txt")
print(next(f)) # header
for line in f:
fields = line.strip().split(",")
# Get unambiguous fields.
id = fields.pop(0)
rank = fields.pop(-1)
year = fields.pop(-1)
# Surround name with quotes.
name = '"{}"'.format(",".join(fields))
print("{},{},{},{}".format(id, name, year, rank))
在测试数据上,输出为
id,name,year,rank
0,"#28 (2002)",2002,
1,"#7 Train: An Immigrant Journey, The (2000)",2000,
2,"$ (1971)",1971,6.4000000000000004
3,"$1000 Reward (1913)",1913,
4,"$1000 Reward (1915)",1915,
5,"$1000 Reward (1923)",1923,
6,"$1,000,000 Duck (1971)",1971,5
7,"$1,000,000 Reward, The (1920)",1920,
8,"$10,000 Under a Pillow (1921)",1921,
答案 1 :(得分:0)
评论太长了。
祝你好运。您的输入文件格式很糟糕。它实际上不是CSV。这有两个选择:(1)在Excel(或您喜欢的电子表格)中打开文件,然后使用制表符分隔符将其保存。保持手指交叉,没有任何字段有标签。或者使用另一个分隔符,例如竖线字符。
(2)将每一行加载到一个只有一列的表中,这是一个大字符串列。然后,将行解析为其组成字段(substring_index()
可能非常有用)。