用引号导入格式奇怪的csv

问题描述

我有一个来自外部的 csv 文件,因此我无法更改其定义或格式,我必须将其读入数据库

文件有一些对于 csv 格式来说看起来很奇怪的东西,我想知道是否有一种方法可以使用 csv.reader 或 pandas 导入它,而不必使用正则表达式或类似的方法进行一些特定的更正。>

文件使用竖线 (|) 作为分隔符。 看看这两个示例行:

1. '11|2000-02-18|Badjora|22|33|44|55|""|""Wood 6.5"" Long Line (Pine - Category:15 m | Humidity max: 13 g/m3)""|4'

2. '333|1999-02-18|Badjora|444|555|666|777|""|"""|4'

有没有办法将其解释为以下字段?

1. 11,2000-02-18,Badjora,22,33,44,55,"Wood 6.5"" Long Line (Pine - Category:15 m | Humidity max: 13 g/m3)",4

2. 333,1999-02-18,444,555,666,777,",4

类似于“考虑引号之间的所有内容”。

我尝试使用导入设置的不同选项,但没有成功。这种格式似乎对 csv 无效。

非常感谢您。

向大家问好

解决方法

假设您的 .csv 文件如下所示:

11|2000-02-18|Badjora|22|33|44|55|""|""Wood 6.5"" Long Line (Pine - Category:15 m | Humidity max: 13 g/m3)""|4
333|1999-02-18|Badjora|444|555|666|777|""|"""|4

你可以很好地阅读该文件:

import csv

with open("sample.csv") as sample:
    reader = csv.reader(sample,delimiter="|")
    for row in reader:
        print(row)

这很好地输出:

['11','2000-02-18','Badjora','22','33','44','55','','Wood 6.5"" Long Line (Pine - Category:15 m ',' Humidity max: 13 g/m3)""','4']
['333','1999-02-18','444','555','666','777','"|4\n']

但是,如果您想修复分隔符,请使用:

with open("sample.csv") as sample,open("fixed_sample.csv","w",newline="") as outfile:
    reader = csv.reader(sample,delimiter="|")
    writer = csv.writer(outfile,delimiter=",")
    for item in reader:
        writer.writerow(item)
,

想出了这个带有pandas的hacky正则表达式分隔符,它适用于您给定的示例。我不建议这样做,并建议使用正则表达式实际修复 csv。无论如何,你去吧:

pd.read_csv('sample.csv',sep=r'"?(?<!\s)\|(?!\s)"?',engine='python',header=None)

仍有一些区域可能会破裂,例如附近没有任何空间的管道。也是一个实际的分隔管,在它之前/之后有空格。主要问题是您的 csv 有导致这些问题的未转义引号。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...