我有一个庞大的文本文件需要导入到 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 数据库的提示:)
最佳答案
awk
一行代码:
awk '{printf("%s", /^L/ ? (p?RS:"") $0: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
更好的可读性:
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;
关于mysql - 将带有子线的行转换为单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46599602/