当csv文件在单元格linux中有逗号时剪切

时间:2014-08-23 15:48:35

标签: mysql linux csv

我有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;

我考虑过使用revcut的某种组合来隔离有问题的列,然后查找/替换逗号,但似乎无法使其工作。想知道这是否是正确的方法,或者是否有更好的方法。

2 个答案:

答案 0 :(得分:2)

看起来第一个字段和最后两个字段都是明确的,所以你要做的就是编写一个脚本来将它们拉出来,然后用引号括起来。我的bash-fu还不够用revcut来完成它,但是我能够编写一个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()可能非常有用)。