Php 如何从txt文件中的一行中获取第一个单词作为前一行的col1数据
我需要第1列中的日期(dd.mm.yy)(如awk$1?)或txt文件中某行的第一个字(格式始终为dd.mm.yy)用作前一行的第1列,以及在第1列的第1行中找到新日期之前的所有下一行,然后,新的日期应该放在前一行的第1列和所有下一行中,直到在第1列中找到新的日期为止 Windows10Pro、Cygwin、PHP7.x 我现在归档(PHP)文件,然后foreach line preg_split(PHP)当前行,使用preg_split_OFFSET_CAPTURE获取单词的数据和位置作为数组 行的preg_split数组中的第一个元素始终为[0]=“”(空),位置为[1]=0。如果下一个元素匹配一个“preg_match('/[0-9]{2}.[0-9]{2}.[0-9]{2}/',$element)”,并且它的位置至少是X,但不超过Y,则它是我想要的日期,用作前一行元素数组中ex的第一个元素,但前一行仅向上,日期所在的行,和所有后续行,直到在一行上找到新日期,然后该新日期应作为前一行上的日期,而不是前一日期 我知道awk可以在匹配前后读取行,但是如何在找到日期的行之前,将日期设置为数组(或其他行)中的第一个元素 输入: XXXXXXPhp 如何从txt文件中的一行中获取第一个单词作为前一行的col1数据,php,awk,cygwin,Php,Awk,Cygwin,我需要第1列中的日期(dd.mm.yy)(如awk$1?)或txt文件中某行的第一个字(格式始终为dd.mm.yy)用作前一行的第1列,以及在第1列的第1行中找到新日期之前的所有下一行,然后,新的日期应该放在前一行的第1列和所有下一行中,直到在第1列中找到新的日期为止 Windows10Pro、Cygwin、PHP7.x 我现在归档(PHP)文件,然后foreach line preg_split(PHP)当前行,使用preg_split_OFFSET_CAPTURE获取单词的数据和位置作为数组
18.05.19
YYYYYYYY
TTTTTTT
uuu
17.05.19
kkkk
GGGGGG
预期输出:
18.05.19 XXXXXXX
18.05.19 YYYYYY
18.05.19 TTTTTTT
17.05.19 UUU
17.05.19 KKK
17.05.19 ggggg
我没有问题将日期附加到日期之后的后续行,但问题是如何将日期附加到前一行,而不是可能存在的日期 编辑: 我忘了说我在Windows+Cygwin上 要读取的源文件的每一行都有多个前导空格,不知道这是否重要。为了测试,我手动删除了这些文件,但没有任何帮助(下面是清理后的原始文件)。要读取的文件的初始样本被最小化了,实际文件的行上有多个单词,我需要它们全部(我想这可以通过使用$0来实现) 这就是我试过的
#!/bin/bash
awk '/^([0-9]{2}\.){2}[0-9]{2}/ { date=$1; next }
NR>1 { print date, prev }
{ prev=$1 }
END { print date, prev }' Infile.txt
关于infle.txt
TTTTT 15MIKROG/ML
13.11.12
90X0.3ML
D. xxx yyy
S. 1 drop 1/d
LKE KJJKJJKJK
TTTTT 15MIKROG/ML
22.05.12
90X0.3ML
D. cccc kkkk
S. 1 tip 1/d MMMMM LLLLL
GGGGG HHHHHH
05.10.11 MEDFG 2.5ML
D. xxx ooo
S. 1 TIP 1/d MMMMM SSSS
GGGGGG HHHHHHH
CVCVCVC 20MG/ML+5MG/ML
03.03.11
60X0.2ML
在包含日期的行上,如前所述,该日期应应用于前一行和后续行,直到找到新日期
但是,如果一个日期在同一行后面有某个内容(除了空格以外的任何内容),则此处仅显示该行
05.10.11 MEDFG 2.5ML
然后,日期不应应用于上一行,而应仅应用于该行和下一行(直到找到新日期,并且it应检查该日期是否是该行上的唯一内容,如果是,则将该日期应用于上一行和下一行等)
所以评论员给出的结果是预期的结果,问题是我无法重现结果
编辑2:
我使用SplFileObject preg_split的PHP方式:
$splFileObjectFile=new SplFileObject($theFileToProcess);
foreach($splFileObjectFile as $lineNr=>$lineContent)
{
$lineContentArr = preg_split('/ {2,}/', $lineContent, -1, PREG_SPLIT_OFFSET_CAPTURE);
// To database
foreach($lineContentArr as $wdKey=>$wordData)
{
$wordNr=$wdKey;
$dataValue=$wordData[0];
$posValue=$wordData[1];
$lineNr=$lineNr;
...
使用SplFileObject,我得到了行号,使用preg_split,每2个或更多的空格,我得到了子数组中一行上的单词,每个子数组中的单词本身及其在行上的位置
所有这些都插入到一个临时SQLite3数据库中,其中包含行nr、字nr、字位置和字本身的列
然后使用一些SQL来获取第一个日期,如果找到日期的行只有日期,则使用更多SQL来用此日期更新前一行日期,等等。这可能就是您要查找的:
$ awk '
/^([0-9]{2}\.){2}[0-9]{2}/ { date=$1; next }
NR>1 { print date, prev }
{ prev=$1 }
END { print date, prev }
' file
18.05.19 XXXXXX
18.05.19 YYYYYYYYYYY
18.05.19 TTTTTTT
17.05.19 UUUUUUUUU
17.05.19 KKKKKKKKK
17.05.19 GGGGGG
我想埃德打败了我,但是锻炼得很好
/^[0-9]{2}.[0-9]{2}.[0-9]{2}$/ {date=$1; next}
{if(last!="") {print date, last} last=$1}
END {print date, last}
awk'
>/^[0-9]{2}.[0-9]{2}.[0-9]{2}$/{date=$1;next}
>{if(last!=“”){打印日期,last}last=$1}
>结束{上次打印日期}
> ' 18.05.19
>YYYYYYYY
>TTTTTTT
>uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
> 17.05.19
>KKKKKKKKK
>GGGGGG
>EOF
18.05.19 XXXXXX
18.05.19 YYYYYYYY
18.05.19 TTTTTTT
17.05.19 UUUU
17.05.19 KKKK
17.05.19 GGGGGG
谢谢你的建议。非常抱歉耽搁了,出现了一些问题。我对问题进行了一些编辑。关于我的解决方案的反馈以及你修改问题的方式将比有用得多。我对问题进行了一些编辑。
。听起来你希望我去阅读你更新的问题,并尝试找出答案ut发生了什么变化,然后运行我的脚本,试图找出它的行为不符合预期,而不是你只是告诉我,等等。YMMV。祝你好运!我对你的解决方案没有任何反馈,只是我无法产生与你相同的结果,你给出了相同的输入。显然我做错了什么。因此,我很难做到,using PHP,请参见编辑的问题。这种PHP方式并不是我想要的,但由于我的日程安排,我不得不做一些事情。不过,感谢您的努力。我无法产生相同的结果
就像说它不起作用
一样有用。我们无法帮您找出如何使它起作用即使如此,这就像告诉你的机械师你的车“坏了”,并希望她能从中修复它。很高兴你用PHP解决了一些问题。谢谢你的建议。非常抱歉耽搁了,出现了一些问题。我对这个问题做了一些编辑。