我有一个庞大的文本文件,我需要导入到SQL数据库。 问题是该文件每条记录包含几行,所以每条记录需要一行一行。
文本文件现在看起来像这样;
L;1;100;Product1;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product3;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product4;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
我需要它这样结束,所以很容易将它导入SQL数据库;
是否有任何SED命令用于此转换,或者它是更好的方法吗?
L;1;100;Product1;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177;TEXT;130;TEXT;156x55;2;40448652267;43242;;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177;TEXT;130;TEXT;156x55;2;40448652267;43242;;3;0481439;344;
L;1;100;Product3;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177;TEXT;130;TEXT;156x55;2;40448652267;43242;;3;0481439;344;
L;1;100;Product4;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177;TEXT;130;TEXT;156x55;2;40448652267;43242;;3;0481439;344;
有关如何以最佳方式将此数据导入mySQL数据库的所有提示,请注意:)
答案 0 :(得分:0)
要保存:
awk '{printf("%s%s",NR==1 && $0 ~ /^L;/?"":($0 ~ /^L;/?RS:""),$0)} END{print ""}' Input_file
输出如下。
L;1;100;Product1;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;T;TEXT2;177T;TEXT;130T;TEXT;156x55O;2;40448652267;43242;O;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;T;TEXT2;177T;TEXT;130T;TEXT;156x55O;2;40448652267;43242;O;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;T;TEXT2;177T;TEXT;130T;TEXT;156x55O;2;40448652267;43242;O;3;0481439;344;
L;1;100;Product3;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;T;TEXT2;177T;TEXT;130T;TEXT;156x55O;2;40448652267;43242;O;3;0481439;344;
L;1;100;Product4;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;T;TEXT2;177T;TEXT;130T;TEXT;156x55O;2;40448652267;43242;O;3;0481439;344;
说明: 也可以添加解释和非单一形式的解决方案。
awk '{
printf("%s%s",NR==1 && $0 ~ /^L;/?"":($0 ~ /^L;/?RS:""),$0) ##Using printf here to print the lines. %s%s to print the lines, So while printing them mentioning 2 conditions here NR==1(where it checks if line is very first line of Input_file and line starts from L; then print NULL else if a line starts from L; then print RS(whose default value is new line) else print NULL value. For second string simple print current line.
} ##So idea behind this logic is simple to print a new line which starts from L; apart from first line, so that we could get output as per OP.
END{
print "" ##In the END block to print a new line simple printing NULL so that a new line will be inserted.
}
' Input_file ##Mentioning the Input_file here.
答案 1 :(得分:0)
这是sed
解决方案,
sed ':a;/O;3/!{N;s/\n//;ba}' file
简要说明,
:a
:设置标签' a'在脚本的开头/O;3/!{N;s/\n//;ba}
:如果行不以" O; 3"开头,请附加下一行并删除' \ n'同样。然后我们回到标签' a'处理以下行。答案 2 :(得分:0)
awk
单行:
awk '{printf("%s", /^L/ ? (p?RS:"") $0:substr($0, index($0,";")+1 ));p=1}END{print ""}' infile
OR(冗长)
awk '/^L/{ if(p)print ""; printf("%s",$0);next}{ printf("%s",substr($0,index($0,";")+1));p=1}END{print ""}' infile
更好的可读性:
awk '/^L/{
if(p)print "";
printf("%s",$0);
next
}
{
printf("%s",substr($0,index($0,";")+1));
p=1
}
END{
print ""
}
' infile
输入:
$ cat infile
L;1;100;Product1;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product3;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
L;1;100;Product4;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;
T;TEXT2;177
T;TEXT;130
T;TEXT;156x55
O;2;40448652267;43242;
O;3;0481439;344;
输出:
$ awk '{printf("%s", /^L/ ? (p?RS:"") $0:substr($0, index($0,";")+1 ));p=1}END{print ""}' infile
L;1;100;Product1;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177TEXT;130TEXT;156x552;40448652267;43242;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177TEXT;130TEXT;156x552;40448652267;43242;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177TEXT;130TEXT;156x552;40448652267;43242;3;0481439;344;
L;1;100;Product3;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177TEXT;130TEXT;156x552;40448652267;43242;3;0481439;344;
L;1;100;Product4;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;TEXT2;177TEXT;130TEXT;156x552;40448652267;43242;3;0481439;344;
答案 3 :(得分:0)
Awk 解决方案:
awk -v ORS= 'NR>1 && /^L/{print "\n"}/^T/{sub(/.;/,";")}END{ print "\n" }1' file
输出:
L;1;100;Product1;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;;TEXT2;177;TEXT;130;TEXT;156x55O;2;40448652267;43242;O;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;;TEXT2;177;TEXT;130;TEXT;156x55O;2;40448652267;43242;O;3;0481439;344;
L;1;100;Product2;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;;TEXT2;177;TEXT;130;TEXT;156x55O;2;40448652267;43242;O;3;0481439;344;
L;1;100;Product3;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;;TEXT2;177;TEXT;130;TEXT;156x55O;2;40448652267;43242;O;3;0481439;344;
L;1;100;Product4;Text;2;Text2;;20171006;;;1;;76;;;U;1000;;;TEXT2;177;TEXT;130;TEXT;156x55O;2;40448652267;43242;O;3;0481439;344;
答案 4 :(得分:0)
你也可以尝试这个
while read l;do [ "${l%%;*}" = 'L' ]&&{ [ $n ] &&echo "${n%;}";n="$l";}||n="$n${l#*;};";done<infile;echo "${n%;}"