我使用的是一个非常大的CSV文件(接近6gb),它绝对是充满了错误。例如,如果我有以下csv文件/表:
+------------+-------------+------------+
| ID | Date | String |
+------------+-------------+------------+
| 123456 | 09-20-2019 | ABCDEFG |
| 123abc456 | 10-30-2019 | HIJKLMN |
| 7891011 | jdqhouehwf | OPQRSTU |
| 1010101 | 03-15-2018 | 8473737 |
| 4823.00 | 02-11-2015 | VWXYZ |
| 2348813.0 | 01-23-2016 | BAZ |
+------------+-------------+------------+
或:
"ID","Date","String"
123456,"09-20-2019","ABCDEFG"
123abc456,"10-30-2019","HIJKLMN"
7891011,"jdqhouehwf","OPQRSTU"
1010101,"03-15-2018",8473737
4823.00,"02-11-2015","VWXYZ"
"2348813.0","01-23-2016","BAZ"
我想要一个很好的方法来解决问题和修复文件。使用熊猫,我可以读入文件:
import pandas as pd
df = pd.read_csv(inputfile)
熊猫总是会抱怨:
sys:1: DtypeWarning: Columns (0) have mixed types. Specify dtype option on import or set low_memory=False
所以我要清理每一列。但是,由于它是一个非常大的文件,我不能只打印我的整个表输出屏蔽和期望读取它。我想要一个简单的方法来获取一个列并检查它是否符合类型。另外,如果可能的话,我还需要一种删除坏行和/或将行转换为正确格式的方法。说到底,我希望文件看起来像(不包括内联注释):
"ID","Date","String"
123456,"09-20-2019","ABCDEFG"
# 123abc456,"10-30-2019","HIJKLMN" was deleted because the ID wasn't a number
# 7891011,"jdqhouehwf","OPQRSTU" was deleted because the data was not a date
1010101,"03-15-2018","8473737" # The last number could be converted to string
4823,"02-11-2015","VWXYZ" # The first number could be converted to integer
2348813,"01-23-2016","BAZ" # The ID number could be converted to int
正如您标记的
sed
,这里有一个命令应该以一种非常有效和可移植的方式来完成这项工作,但是它有点不可读。。。你知道吗它的作用是:
1p
)s
)命令,并且仅当替换成功时才打印结果(因此仅当行与搜索模式匹配时)s/…/…/p
。你知道吗关于替换模式
\1\3"\6"
,每个转义的数字都指向相应的捕获组(\(…\)
;请记住,根据开始\(
标记出现的顺序为这些组分配了一个数字)。具体来说:\1
表示前导数([0-9]\+
),有或没有(\{0,1\}
)以下三件事:"
\.[0-9]*
"
\3
指的是包含在"
周围的日期("\(0[0-9]\|1[0-2]\)-\([0-2][0-9]\|3[01]\)-2[0-9]\{3\}"
,注意我在这个正则表达式中是不准确的,因为它也会匹配不存在的日期,比如2月31日);"\6"
引用(并把它放在"
之间)到最后的字母数字字符串,我对它几乎没有任何假设([^"]*
)。这应该与日期匹配得更好一些(除了2月29日总是匹配,无论年份如何):
相关问题 更多 >
编程相关推荐