将逗号分隔值(CSV)拆分为固定列数的目标表,通常是指将一行文本中以逗号分隔的多个值拆分并插入到具有固定列数的数据库表中。这个过程涉及到数据解析、转换和加载(ETL)。
SUBSTRING_INDEX
)进行拆分。原因:CSV文件中的某些行可能包含不同数量的值,导致拆分失败。
解决方法:
TRY...CATCH
块捕获异常,并记录错误行以便后续处理。import csv
input_file = 'data.csv'
output_file = 'output.csv'
with open(input_file, 'r') as infile, open(output_file, 'w', newline='') as outfile:
reader = csv.reader(infile)
writer = csv.writer(outfile)
for row in reader:
if len(row) != 3: # 假设目标表有3列
print(f"Invalid row: {row}")
continue
writer.writerow(row)
原因:CSV文件中的某些值可能包含逗号、引号等特殊字符,导致解析错误。
解决方法:
csv
模块)自动处理特殊字符。import csv
input_file = 'data.csv'
output_file = 'output.csv'
with open(input_file, 'r', newline='') as infile, open(output_file, 'w', newline='') as outfile:
reader = csv.reader(infile, delimiter=',', quotechar='"')
writer = csv.writer(outfile)
for row in reader:
writer.writerow(row)
原因:处理大量数据时,拆分和加载过程可能会非常耗时。
解决方法:
import csv
import psycopg2
input_file = 'data.csv'
output_table = 'target_table'
conn = psycopg2.connect(database="yourdb", user="youruser", password="yourpass", host="yourhost", port="yourport")
cursor = conn.cursor()
with open(input_file, 'r') as infile:
reader = csv.reader(infile)
next(reader) # 跳过表头
batch_size = 1000
batch = []
for row in reader:
batch.append(row)
if len(batch) >= batch_size:
cursor.executemany(f"INSERT INTO {output_table} (col1, col2, col3) VALUES (%s, %s, %s)", batch)
batch = []
if batch:
cursor.executemany(f"INSERT INTO {output_table} (col1, col2, col3) VALUES (%s, %s, %s)", batch)
conn.commit()
cursor.close()
conn.close()
通过以上方法,可以有效地将逗号分隔值拆分为固定列数的目标表,并解决常见的数据格式不一致、特殊字符处理和性能瓶颈等问题。
没有搜到相关的沙龙
领取专属 10元无门槛券
手把手带您无忧上云