1、现象描述
背景描述:SQL Management Studio导出表为 sl_topup.txt后,文本格式为 GBK,使用 python 脚本将 GBK 转成 UTF-8。由于文件太大,内存不够,使用 TXTkiller.exe 拆分 sl_topup.txt 为100 个文件(按行拆分)。
使用 COPY 指令将 txt 导入到 postgresql报错:
使用 ";" 作为导出分隔符 重复测试:
打开 sl_topup_094.txt(转成 utf-8),在 230871 行出现两条记录合并成了一行
sl_topup_094(gbk编码)同样,所以应该不是python 脚本转 UTF-8 造成的。
2、解决
python 脚本处理
import os def list_folders_files(path): """ 返回 "文件夹" 和 "文件" 名字 :param path: "文件夹"和"文件"所在的路径 :return: (list_folders, list_files) :list_folders: 文件夹 :list_files: 文件 """ list_folders = [] list_files = [] for file in os.listdir(path): file_path = os.path.join(path, file) if os.path.isdir(file_path): list_folders.append(file) else: list_files.append(file) return (list_folders, list_files) def convert(filePath, default_length, outfile): file = open(filePath, encoding='utf-8') for line in file: line_len = len(line.split(',')) if (line_len != default_length): print('字段数:{0}'.format(line_len)) print('待处理的字符串:{0}'.format(line)) list = line.split(',') record1_id = list[0] record2_id = int(record1_id) + 1 line_index = line.index(str(record2_id)) # print(line[0:line_index]) line = line[0:line_index] + " " + line[line_index:-1] + ' ' print('处理后的字符串:{0}'.format(line)) outfile.write(bytes(line, encoding="utf8")) print(filePath.split('\')[-1] + '读取完毕') # 将路径下面的所有文件,如果一行中有两行记录的,处理成两行 if __name__ == "__main__": base_path = 'C:\Users\oy\Desktop\test\data' (list_folders, list_files) = list_folders_files(base_path) print('所有需要处理的文件:{0}'.format(list_files)) for fileName in list_files: filePath = base_path + '\' + fileName default_length = 16 # 默认字段数(使用','切割字符串后得到16份) outfile = open(base_path + '\out_' + fileName, "wb") convert(filePath, default_length, outfile)
---