我有一个带有标题名称超过5k字段/列的csv文件。我想只将一些特定字段导入我的数据库。
我正在使用本地infile来处理需要导入的其他小文件
LOAD DATA
LOCAL INFILE 'C:/wamp/www/imports/new_export.csv'
INTO TABLE table1
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
(colour,shape,size);
为要跳过的列分配虚拟变量可能很麻烦。另外,如果文件有其他字段,我更愿意使用字段标题来引用未来的证据
我正在考虑在将文件加载到数据库之前在文件上使用awk。但我在搜索中找到的例子似乎不起作用。
对此最佳方法的任何建议都将不胜感激。
答案 0 :(得分:1)
这类似于MvG的答案,但它不需要gawk
4,因此在答案中建议使用-F
。它还显示了列出所需字段并迭代列表的技术。如果列表很大,这可能会使代码更容易维护。
#!/usr/bin/awk -f
BEGIN {
col_list = "colour shape size" # continuing with as many as desired for output
num_cols = split(col_list, cols)
FS = OFS = ","
}
NR==1 {
for (i = 1; i <= NF; i++) {
p[$i] = i # remember column for name
}
# next # enable this line to suppress headers.
}
{
delim = ""
for (i = 1; i <= num_cols; i++) {
printf "%s%s", delim, $p[cols[i]]
delim = OFS
}
printf "\n"
}
答案 1 :(得分:0)
您的实际数据是否有逗号?如果没有,您最好使用cut
:
cut -d, -f1,2,5,8-12
将选择命名字段,在,
分割行。如果您的任何"
封闭文字字段确实包含,
,那么事情就会中断,因为cut
不了解"
。
答案 2 :(得分:0)
这是一个功能齐全的解决方案,可以处理csv表值中的各种引号和逗号,并可以按名称提取列。它需要gawk
,并且基于this answer中建议的FPAT
功能。
BEGIN {
# Allow simple values, quoted values and even doubled quotes
FPAT="\"[^\"]*(\"\"[^\"]*)*\"|[^,]*"
}
NR==1 {
for (i = 1; i <= NF; i++) {
p[$i]=i # remember column for name
}
# next # enable this line to suppress headers.
}
{
print $p["colour"] "," $p["shape"] "," $p["size"]
}
将此内容写入文件,由gawk -f file.awk
调用。
由于列拆分和逐个标头的功能是正交的,您可以使用非GNU awk上的部分脚本来按列名选择,而不是使用FPAT
而是简单{{ 1}}而不是。