Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 使用应用程序语言拆分发生次数可变的字符串(最好是批处理脚本)_String_Batch File_Split - Fatal编程技术网

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如果要使用我的答案,必须将整个文件读入单个字符串变量。逐行迭代根本不起作用,我的最新答案。