问题
CSV 文件中的金额格式加了千分位符号(如 1,000.00
),表字段类型为数字格式,DataX 无法正常导入数据库。
其中 CSV 文件为流水数据,所以需要保证导入的时序性,文件格式如下:
csv-old/
|-- abc2021-11-18.csv
|-- abc2021-11-19.csv
|-- abc2021-11-30.csv
# ...
|-- abc2022-02-17.csv
其中 CSV 第 8、9、10 列为金额,需要移除千分位符。
解决
import os
import re
import pandas
import cchardet
""" """
def r(src, dst, f):
if os.path.isdir(src):
if not os.path.exists(dst):
os.makedirs(dst)
for basename in os.listdir(src):
sub_src = os.path.join(src, basename)
sub_dst = os.path.join(dst, basename)
r(sub_src, sub_dst, f)
elif os.path.isfile(src):
f(src, dst)
""" """
def f(src, dst):
period_name = re.compile(r'\d{4}-\d{2}').findall(src)[-1] # 提取流水月份作为合并后的文件名
dst = os.path.join(os.path.dirname(dst), period_name + '.csv')
print(src + ' => ' + dst)
encoding = None
with open(src, 'rb') as f:
encoding = cchardet.detect(f.read())['encoding']
df = pandas.read_csv(src, encoding=encoding, low_memory=True, dtype=object) # `dtype=object` 禁用自动类型推断全部以字符串形式读取
df[df.columns[7]] = df[df.columns[7]].map(lambda amount: amount.replace(',',''))
df[df.columns[8]] = df[df.columns[8]].map(lambda amount: amount.replace(',',''))
df[df.columns[9]] = df[df.columns[9]].map(lambda amount: amount.replace(',',''))
df.to_csv(dst, index=False, mode='a', encoding=encoding) # `mode='a'` 以追加方式合并
r('./csv-old', './csv-new', f)