导入带有引号的奇怪格式的 csv
Import oddly formatted csv with quotes
我有一个来自外部的 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,Badjora,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', 'Badjora', '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 包含导致这些问题的未转义引号。
我有一个来自外部的 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,Badjora,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', 'Badjora', '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 包含导致这些问题的未转义引号。