当前位置: 首页 > 知识库问答 >
问题:

使用awk将csv文件解析为数组

谢昊乾
2023-03-14

我必须解析一个csv文件,并将其内容转储到mysql表中。


# myfile.csv

# Contents
# Sample Headers

"header1 with quotes", header2withoutquotes, "header3", header4, hdeader5
"Sample Text",2,3,4,"MoreText, with commas"
"Text2 with escaped \"",8,6,7,9
"Text3",876,0.6,7,10

第一输出


rowid|header1 with quotes|Sample Text|myfile
1|header2withoutquotes|2|myfile
1|header3|3|myfile
1|header4|4|myfile
1|header5|MoreText, with commas|myfile

2|header1 with quotes|Text2 with escaped \"|myfile
2|header2withoutquotes|8|myfile
2|header3|6|myfile
2|header4|7|myfile
2|header5|9|myfile

3|header1 with quotes|text3|myfile
3|header2withoutquotes|876|myfile
3|header3|0.6|myfile
3|header4|7|myfile
3|header5|10|myfile

在第二个输出中,我需要自定义标头水平对齐。例如


rowid|"header1 with quotes"|"header3"|header4|filename 
1|Sample Text|3,4,myfile
2|Text2 with escaped \"|6|7|myfile
3|Text3|0.6|7|myfile

对于第二个输出,它可以是我选择的任何一组标题。然后,我可以使用load data infile将这两个输出数据加载到mysql表中。正在寻找awk脚本来实现这一点。如果你还需要什么,请告诉我。德克萨斯州。

共有2个答案

劳灵均
2023-03-14

我将把输出格式留给您,但以下是如何在处理一些字段周围的嵌入逗号、转义引号和不需要的空格后创建字段数组,以便您可以对它们执行任何操作:

$ cat tst.awk
BEGIN { FPAT = "([^,]*)|(\"[^\"]+\")" }
{ sub(/#.*/,"") }
NF {
    # replace all escaped quotes with a newline and resplit the record
    gsub(/\\"/,RS)

    for (i=1;i<=NF;i++) {
        # restore the escaped quotes in this field
        gsub(RS,"\\\"",$i)

        f[i] = $i
    }

    for (i=1;i<=NF;i++) {
        # remove this to leave leading/trailing white space:
        gsub(/^[[:space:]]+|[[:space:]]+$/,"",f[i])

        # remove this to leave quotes around fields:
        gsub(/^"|"$/,"",f[i])

        print NR, NF, i, "<" f[i] ">"
    }
    print "----"
}

.

$ awk -f tst.awk file
4 5 1 <header1 with quotes>
4 5 2 <header2withoutquotes>
4 5 3 <header3>
4 5 4 <header4>
4 5 5 <hdeader5>
----
5 5 1 <Sample Text>
5 5 2 <2>
5 5 3 <3>
5 5 4 <4>
5 5 5 <MoreText, with commas>
----
6 5 1 <Text2 with escaped \">
6 5 2 <8>
6 5 3 <6>
6 5 4 <7>
6 5 5 <9>
----
7 5 1 <Text3>
7 5 2 <876>
7 5 3 <0.6>
7 5 4 <7>
7 5 5 <10>
----

上面使用GNU awk forFPAT,其他awk需要while(匹配(...))循环

看见http://www.gnu.org/software/gawk/manual/gawk.html#Splitting-通过内容了解FPAT如何将输入拆分为字段。除此之外:

  1. 第一个sub()并测试NF是否放弃注释和空行

其余的应该是显而易见的。我正在剥离使用f[]的前导/尾随空格和引号,而不是填充它的位置,因为您似乎想要至少2个不同的输出,一个带有周围的引号,一个没有,但您可以选择其中任何一个gsub()s完成。

学习awk——获取阿诺德·罗宾斯的《有效的awk编程》第四版。

许黎明
2023-03-14

这应该是有效的:

{
    if(NR==1)
        split($0,header,",")
    else
    {
        split($0,line,",")
        for (i in line)  
        {
            gsub(/^[ \t]+|"|[ \t]+$)/, "", header[i]); 
            gsub(/^[ \t]+|"|[ \t]+$)/, "", line[i]); 
            print header[i]"|"line[i]"|"FILENAME
        }
        print ""
    }
}

基本上,它将第一行存储在head数组中,然后拆分中的每一行,并修剪前导和尾随空格或制表符。最后,它组成输出字符串。

输出:

header1|text1|file2
header2|2|file2
header3|3|file2
header4|4|file2
hdeader5|moretext|file2

header1|text2|file2
header2|8|file2
header3|6|file2
header4|7|file2
hdeader5|9|file2

header1|text3|file2
header2|876|file2
header3|0.6|file2
header4|7|file2
hdeader5|10|file2

通过删除最后一条print”“语句,可以去除每个块之间的换行符。

 类似资料:
  • 问题内容: 我有一系列使用Beautiful Soup解析为单个文本文件的HTML文件。HTML文件的格式设置为使其输出始终为文本文件中的三行,因此输出将类似于: 但这很容易 换句话说,HTML文件的内容在每个文件中并不是真正的标准,但是它们始终会产生三行。 因此,我想知道如果我想从Beautiful Soup生成的文本文件然后将其解析为带有以下内容的列的CSV文件(使用上面的示例),应该从哪里开

  • 我完全是一个AWS新手,试图用AWS Textract将多页文件表解析为CSV文件。在本页中,我尝试使用AWS的示例,但是当我们处理多页文件时,中断,因为在这些情况下我们需要异步处理,正如您在这里的文档中看到的那样。正确的调用函数应该是并在运行后使用。 所以,我用这个逻辑修改了他们的例子,而不是使用函数,修改后的代码看起来像这样: 但是当我运行时,我得到以下错误: 这是因为调用的标准方法是将S3文

  • 问题内容: 使用nodejs,我想解析一个包含10000条记录的.csv文件,并对每一行进行一些操作。我尝试使用http://www.adaltas.com/projects/node- csv 。我无法让它在每一行暂停。这只会读取所有10000条记录。我需要执行以下操作: 逐行读取csv 在每条线上执行耗时的操作 转到下一行 有人可以在这里提出其他建议吗? 问题答案: 好像您需要使用一些基于流的

  • 使用nodejs,我想解析一个包含10000条记录的.csv文件,并对每一行执行一些操作。我尝试使用http://www.adaltas.com/projects/node-csv。我不能让它每排都停下来。这只是读取所有的10000个记录。我需要做到以下几点: 逐行读取csv 对每行执行耗时操作 转到下一行

  • 我读过以下关于csv解析的留档http://gatling.io/docs/2.0.1/session/feeder.html#feeder 我仍然无法捕获以下实现: 如何在Scala中创建变量,代表csv文件中的每一列 如果有两个用户按顺序运行,Gatling如何为这两个用户解析CSV文件?在第一个值被解析后,它会自动查找下一个值吗 我想要达到的目标是: > Gatling读取包含SIM序列号和

  • 问题内容: 假设我有一个包含以下内容的文件: 如何通过PHP解析内容? 问题答案: 只需使用该功能即可解析CSV文件