【发布时间】:2017-04-13 18:57:28
【问题描述】:
我有 200k csv 文件,我需要将它们全部导入到一个 postgresql 表中。它是来自各种设备的参数列表,每个 csv 的文件名都包含设备的序列号,我需要它位于每一行的列之一中。
所以为了简化,我有几列数据(没有标题),假设每个 csv 文件中的列是:日期、变量、值和文件名包含 SERIALNUMBER_and_someOtherStuffIDontNeed.csv
我正在尝试使用 cygwin 编写一个 bash 脚本来迭代文件并为我执行此操作,但是由于某种原因它不起作用,显示“在“as”处或附近出现语法错误'
这是我的代码:
#!/bin/bash
FILELIST=/cygdrive/c/devices/files/*
for INPUT_FILE in $FILELIST
do
psql -U postgres -d devices -c "copy devicelist
(
Date,
Variable,
Value,
SN as CURRENT_LOAD_SOURCE(),
)
from '$INPUT_FILE
delimiter ',' ;"
done
我正在学习 SQL,所以这可能是一个明显的错误,但我看不到它。
我还知道,在这种形式下,我将获得完整的文件名,而不仅仅是我想要的序列号位,但我以后可能会以某种方式处理它。
请指教。
谢谢。
【问题讨论】:
-
您不能将所有输入合并到一个格式正确的文件中,并使用类似
bcp的实用程序在一次操作中加载它吗?这将非常缓慢。在任何情况下,您的 for 循环都会失败,因为*将扩展为[Arg list too long]错误。使用find . | xargs awk ' ...' >> allInOneFile.txt创建您的文件。写这篇文章是一个小型的咨询活动。祝你好运。 -
好点@shellter - 有一些简单的方法可以从命令行组合多个文本文件。
-
copy ... from program 'sed "s/$/,$INPUT_FILE/" $INPUT_FILE' ... -
感谢您的 cmets,我实际上正在创建一个格式正确的 csv,但是它需要很长时间......它从昨天开始运行,我估计它会花费至少再过一天左右,因此这并不是最好的解决方案。
-
不要认为一次加载文件 1 条记录会更快 ;-/ 。除非您的文件是 TB 大小,或者您仍在 Pentium 386 上运行,否则您创建“一个正确格式的 csv”的方式几乎肯定有问题。通常,处理所需的时间少于写入磁盘的时间。在一个体面的环境中,每分钟 1 GB 是旋转磁盘的合理基准。您可以发布一个带有格式问题的新 Q,进行修复,然后在当前解决方案完成之前重新运行所有文件;-)!?祝你好运!!
标签: mysql bash postgresql python-3.x csv