String 使用应用程序语言拆分发生次数可变的字符串(最好是批处理脚本)
我有一个包含冒号分隔行的文本文件,如下所示:String 使用应用程序语言拆分发生次数可变的字符串(最好是批处理脚本),string,batch-file,split,String,Batch File,Split,我有一个包含冒号分隔行的文本文件,如下所示: OK-10:Jason:Jones:ID No:00000000:male:my notes OK-10:Mike:James:ID No:000000
OK-10:Jason:Jones:ID No:00000000:male:my notes
OK-10:Mike:James:ID No:00000001:male:my notes OZ-09:John:Rick:ID No:00000002:male:my notes
OK-08:Michael:Knight:ID No:00000004:male:my notes2 OK-09:Helen:Rick:ID No:00000005:female:my notes3 OZ-10:Jane:James:ID No:00000034:female:my notes23 OK-09:Mary:Jane:ID No:00000023:female:my notes46
请注意,并非所有行都有相同数量的术语。我希望每一行都像第一行一样,即只有七个术语。对于经过的管线,应形成新的管线。新行分隔符是O&
,其中&
只能是Z
或K
。因此,上述的预期输出为:
OK-10:Jason:Jones:ID No:00000000:male:my notes
OK-10:Mike:James:ID No:00000001:male:my notes
OZ-09:John:Rick:ID No:00000002:male:my notes
OK-08:Michael:Knight:ID No:00000004:male:my notes2
OK-09:Helen:Rick:ID No:00000005:female:my notes3
OZ-10:Jane:James:ID No:00000034:female:my notes23
OK-09:Mary:Jane:ID No:00000023:female:my notes46
有人能推荐一种使用文本编辑工具、regex或应用程序语言(最好是批处理脚本、Java或Python)来实现这一点的方法吗
更新
我尝试使用python和答案中提供的正则表达式代码:
导入csv
进口稀土
with open('form.csv') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for row in csv_reader:
matches = re.findall(r'O[KZ]-\d+:(?:[^:]+:){5}.*?(?= O[KZ]|$)', row[29])
print(matches)
但如果一个单元格包含多个条目,如:
OK-10:Mike:James:ID No:00000001:male:my notes OZ-09:John:Rick:ID No:00000002:male:my notes
它只返回它们中的第一个。这里是一个基于正则表达式的Python解决方案,它似乎工作得很好:
with open('form.csv', 'r') as file:
inp = file.read().replace('\n', '')
matches = re.findall(r'O[KZ]-\d+:(?:[^:]+:){5}.*?(?= O[KZ]|$)', inp)
print(matches)
这张照片是:
['OK-10:Mike:James:ID No:00000001:male:my notes',
'OK-08:Michael:Knight:ID No:00000004:male:my notes2',
'OK-09:Helen:Rick:ID No:00000005:female:my notes3',
'OZ-10:Jane:James:ID No:00000034:female:my notes23',
'OK-09:Mary:Jane:ID No:00000023:female:my notes46']
下面是regex模式工作原理的简要总结:
O[KZ]-\d+: match the first OK/OZ-number term
(?:[^:]+:){5} then match the next five : terms
.*?(?= O[KZ]|$) finally match the remaining sixth term
until seeing either OK/OZ or the end of the input
我的脚本生成的输出是一个列表,您可以将其写回文本文件,以便稍后导入MySQL。请注意,我们在开始时将整个文件读入单个字符串变量。这是使用此正则表达式方法所必需的。简单到:
@echo off
setlocal EnableDelayedExpansion
for /F %%a in ('copy /Z "%~F0" NUL') do (set CRLF=%%a^
%Do not remove this line%
)
(for %%n in ("!CRLF!") do for /F "delims=" %%a in (input.txt) do (
set "line=%%a"
for %%d in (Z K) do set "line=!line: O%%d-=%%~nO%%d-!"
echo(!line!
)) > output.txt
如果您认为将来可能有额外的文件处理任务,将受益于通用ReGEX文本处理实用程序,那么您可能会考虑。它是纯脚本(JScript/batch),从XP开始在任何Windows计算机上运行-不需要第三方exe文件
jrepl "((?:[^:]*:){6}.*?) (?=O[KZ]-)" "$1\r\n" /xseq /f "yourFile.txt" /o -
假设O[KZ]-
除了每个逻辑行的开头之外没有出现在任何地方,那么您应该能够使用这个更简单的正则表达式:
jrepl "\s+(?=O[KZ]-)" "\r\n" /xseq /f "yourFile.txt" /o -
完整文档内置于JREPL中,可通过
JREPL/?
或JREPL/??
获取分页帮助。所有选项的摘要可通过jrepl/?options
获得,所有类型的帮助的摘要可通过jrepl/?help
获得。我编辑了您的问题,该问题的措辞仍然错误。我希望你能在这里找到帮助+1。谢谢你,我对python一无所知,所以我必须搜索如何打开csv,使用你的解决方案更新它并保存它以进行测试。你所要做的就是将文本文件读入python,使用我的脚本,然后写回列表,每行一个条目,就这些。是的,我现在正在看一些教程,是时候接触python了:)我会在测试它时回来。再次感谢您的支持help@netdev如果要使用我的答案,必须将整个文件读入单个字符串变量。逐行迭代根本不起作用,我的最新答案。