我正在尝试将CSV转换为json以供Elasticsearch使用。 这是一个示例csv:
user,user_creation_time
UserName1,2018-02-21T15:57:53+00:00
UserName2,N/A
数组类型:user
-str
,
user_creation_time
-ISO时间或str('N/A')
问题在于,ElasticSearch接收值N/A
失败,因为它期望类型为date
。
我有更多的时间字段与此问题有关(一旦它是日期,则为字符串)。实现此目标的最佳方法是什么?
最后,功能应类似于:
csv
user,user_creation_time
UserName1,2018-02-21T15:57:53+00:00
UserName2,N/A
python
{"user":"UserName1","user_creation_time":"2018-02-21T15:57:53+00:00"}
{"user":"UserName2","user_creation_time":None}
json
{"user":"UserName1","user_creation_time":"2018-02-21T15:57:53+00:00"}
{"user":"UserName2","user_creation_time":null}
我现在要做的是:
import csv
with open(csv_file, 'r') as inf:
reader = csv.DictReader(inf.readlines())
print(json.dumps(tuple(reader)))
答案 0 :(得分:0)
我最终做了与@stovfl建议的相同的操作。 并创建了此https://gist.github.com/1oglop1/9950b033dc655f675ebc11ac122ab815
另一个肮脏的解决方案是替换字符串中的值,将其转换为json,将json转储为字符串,替换不同的值并在再次加载时获得正确的结构
with open(csv_file, 'r') as inf:
file_content = inf.read()
no_na = file_content.replace('N/A', '').replace('not_supported', '')
rdr = csv.DictReader(no_na.splitlines())
records = json.dumps(tuple(rdr))
fixed_json = records.replace('""', "null").replace('"false"', "false").replace("'true'", "true")
print('jsn',records)
print(fixed_json)
print(json.loads(fixed_json)) # correct dict