2

我有一个 csv 文件,其中包含超过 5k 个带有标题名称的字段/列。我只想将一些特定字段导入我的数据库。

我正在将本地 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。但是我在搜索中找到的示例似乎不起作用。

对此最佳方法的任何建议将不胜感激。

4

3 回答 3

1

这类似于 MvG 的答案,但它不需要gawk4,因此-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"
}
于 2012-07-05T17:01:30.740 回答
0

你的实际数据有逗号吗?如果没有,您最好使用cut

cut -d, -f1,2,5,8-12

将选择命名字段,在,. 如果您的任何 -"封闭的文本字段确实包含 a ,,事情就会中断,因为cut不知道".

于 2012-07-05T14:35:09.700 回答
0

这是一个功能齐全的解决方案,可以处理csv表的值中的各种引号和逗号,并且可以按名称提取列。它需要gawk并基于此答案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而是简单-F,

于 2012-07-05T15:27:09.877 回答