从文本文件中提取特定字段

时间:2012-07-05 14:27:20

标签: mysql sql awk file-io

我有一个带有标题名称超过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。但我在搜索中找到的例子似乎不起作用。

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

3 个答案:

答案 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}}而不是。