我有200k csv文件,我需要将它们全部导入到一个postgresql表中。它是来自各种设备的参数列表,每个csv的文件名都包含设备的序列号,我需要它在每行的一个列中。
所以为了简化,我有几列数据(没有标题),让我们说每个csv文件中的列是:日期,变量,值和文件名包含SERIALNUMBER_and_someOtherStuffIDontNeed.csv
我正在尝试使用cygwin编写一个bash脚本来迭代文件并为我做,但由于某种原因它不起作用,显示'语法错误在或附近“为”'
这是我的代码:
#!/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,所以这可能是一个明显的错误,但我看不到它。
我也知道,在那种形式下,我将获得完整的文件名,而不仅仅是我想要的序列号,但我可能会稍后处理。
请告知。
感谢。
答案 0 :(得分:0)
我认为postgres中没有CURRENT_LOAD_SOURCE()函数。解决方法是在副本上保留名称列NULL,并且在复制之后将补丁程序设置为所需的值。我更喜欢shell here-document
,因为这样可以更容易地引用SQL主体内部。 (顺便说一句:对于10K的文件,获取FILELIST所需的通配符可能会超过shell的argmax ...)
#!/bin/bash
FILELIST="`ls /tmp/*.c`"
for INPUT_FILE in $FILELIST
do
echo "File:" $INPUT_FILE
psql -U postgres -d devices <<OMG
-- I have a schema "tmp" for testing purposes
CREATE TABLE IF NOT EXISTS tmp.filelist(name text, content text);
COPY tmp.filelist ( content)
from '/$INPUT_FILE' delimiter ',' ;
UPDATE tmp.filelist SET name = '$FILELIST'
WHERE name IS NULL;
OMG
完成