PostgreSQL多个CSV导入并为每列添加文件名

时间:2016-11-29 17:05:41

标签: mysql bash postgresql python-3.x csv

我有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,所以这可能是一个明显的错误,但我看不到它。

我也知道,在那种形式下,我将获得完整的文件名,而不仅仅是我想要的序列号,但我可能会稍后处理。

请告知。

感谢。

1 个答案:

答案 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

完成

相关问题