我必须解析一个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脚本来实现这一点。如果你还需要什么,请告诉我。德克萨斯州。
我将把输出格式留给您,但以下是如何在处理一些字段周围的嵌入逗号、转义引号和不需要的空格后创建字段数组,以便您可以对它们执行任何操作:
$ 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
如何将输入拆分为字段。除此之外:
sub()
并测试NF
是否放弃注释和空行
其余的应该是显而易见的。我正在剥离使用f[]
的前导/尾随空格和引号,而不是填充它的位置,因为您似乎想要至少2个不同的输出,一个带有周围的引号,一个没有,但您可以选择其中任何一个gsub()
s完成。
学习awk——获取阿诺德·罗宾斯的《有效的awk编程》第四版。
这应该是有效的:
{
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文件