我有一个包含几个JSON列的CSV文件,我正在使用python panda阅读它。示例文件数据如下所示:
12345,67890,{"key1":"value1","key2":"value2","key3":"value3"},abcdefgh,{"key4":"value4"}
12345,67890,NONE,abcdefgh,{"key4":"value4"}
在读取CSV时,我使用,
作为分隔符,但这会导致问题,因为JSON数据也包含,
,最终行没有正确分隔。
pd.read_csv('s3://bucket-name/file.csv', sep=",")
我还尝试了另一个正则表达式[a-zA-Z0-9],|[}],
作为分隔符,但这从列数据中删除了最后一个字符(,
之前的1个字符)。
如果我们不接受json元素后面的逗号,我们就可以正确加载文件。
import pandas as pd
import io
input_csv = io.StringIO("""
12345, 67890,{"key1":"value1", "key2":"value2","key3":"value3"},abcdefgh,{"key4":"value4"}
12345,67890,NONE, "abcdefgh",{"key4":"value4"}
""")
df = pd.read_csv(input_csv, header=None,
sep=r',(?! ?"w+"(?=:))', engine='python')
print(df.to_string())
---------------------------------------
0 1 2 3 4
0 12345 67890 {"key1":"value1", "key2":"value2","key3":"value3"} abcdefgh {"key4":"value4"}
1 12345 67890 NONE "abcdefgh" {"key4":"value4"}
"(? !?" w +"(? =:)),G,匹配字符,索引为4410(2C16或548)字面上(区分大小写)负向前看(?!?"w+"(?=:))断言下面的正则表达式不匹配索引为3210(2016或408)的字符敏感的)?匹配前一个标记0到1次,如尽可能多地回馈需要的人(贪婪)"匹配字符";索引为3410(2216或428)(区分大小写)w匹配任何单词字符(相当于[a-zA-Z0-9_])
- 在一次到无限次之间匹配前一个令牌,尽可能多地匹配,根据需要返回(贪婪)"匹配字符";索引为3410(2216或428)(区分大小写)正向前看(?=:)断言下面的Regex匹配:匹配字符:索引5810 (3A16或728)字面上(大小写)敏感)