如何从CSV文件中获取文件名并将其插入到表格的一个列中

7
假设mt表名称为Table_1
表的结构类似于:
EMP_id, Emp_Name, File_Name_Input_Date (columns)

我正在从CSV文件加载Table_1。这个CSV文件的名称是daily_01122014.csv

我正在使用垂直复制命令来加载此表:

ex copy Table_1 from '/location/daily_01122014.csv'delimiter ',';

它将加载表格,但列名为“File_Name_Input_Date”的值将为空,我必须手动编码。我的要求是编写一个shell脚本,动态读取文件名并将其加载到“File_Name”列中,并从文件名中提取日期。例如:如果文件名是daily_01122014.csv,则在加载Table_1时,“File_Name”列应为daily_01122014.csv,“Input_Date”列应为2014-12-01。由于我有50-60个文件,无法手动完成。

2
您的请求已经得到解决! - Up_One
2个回答

2
您可以在将数据加载到Vertica之前,将此字符串添加到文件中。 以下是一个示例:
[dbadmin@DCXLG001 tmp]$ cat file001.csv
1,Adrian
[dbadmin@DCXLG001 tmp]$ ls -1 file*.csv|xargs -I% sed -i 's/$/,%/' %
[dbadmin@DCXLG001 tmp]$ cat file001.csv
1,Adrian,file001.csv

- 我有一个名为file*.csv的文件,我想将文件名添加到实际文件的每一行末尾。 您可以对任意多个文件执行此操作。 我会使用操作系统资源来进行这个转换,而不是使用Vetica的复制命令创建填充器。


2

您可以在COPY中使用CURRENT_LOAD_SOURCE():

COPY t (c1, c2, c3 AS CURRENT_LOAD_SOURCE()) 
FROM '/home/load_file_1' ON exampledb_node02, '/home/load_file_2' ON exampledb_node03 
DELIMITER ',';

或者,您可以使用一个shell脚本

#!/bin/bash
for INPUT_FILE in /path/to/file*.dat; do
vsql -c "copy test_file_name_insert
(
input_file_name as '$INPUT_FILE',
id,
name
)
from '/home/test_input_file.txt'
delimiter '|' ;"
done

听起来他也想解析出日期。也许像 TO_DATE(SPLIT_PART(SPLIT_PART(CURRENT_LOAD_SOURCE(),'_',2),'.',1),'DDMMYYYY')) 这样的东西会起作用。不确定,他在问题的一部分中引用了一列,然后在稍后又引用了两列。 - woot
@woot 先生,我认为您有些过分了。 - Kermit
“成为绿色的青蛙并不容易,对吧 @Kermit?” - woot
如果你整天在woot上购物,那就不是问题了。 - Kermit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接