我有一个包含很多行的文件。每行都有一列可能包含逗号分隔值。我需要每一行都是不同的(即没有逗号分隔的值)。
以下是一个示例行:
AB AB10,AB11,AB12,AB15,AB16,AB21,AB22,AB23,AB24,AB25,AB99 ABERDEEN Aberdeenshire
列以逗号分隔(邮政编码区,邮政编码区,邮政城镇,前邮政县)。
所以上面的行会变成:
AB AB10 ABERDEEN Aberdeenshire AB AB11 ABERDEEN Aberdeenshire AB AB12 ABERDEEN Aberdeenshire ... ...
我尝试了以下但是没有用......
(.+)\t(([0-9A-Z]+),)+\t(.+)\t(.+)
答案 0 :(得分:0)
你想要做的是通过创建排列将一行“爆炸”成许多行。如果只有一个列具有多个值,则可以使用正则表达式完成此操作,但如果有多个多值列,则已经存在许多可能的排列(例如 m ×< em> n 组合,其中 m 和 n 是两个多值列中的值的数量。)
我认为正则表达式不适合执行此任务。
答案 1 :(得分:0)
我同意RegEx并不是最好的方式,但如果您可以使用的话,这应该会有效。 (反复完成,直到没有更多匹配)
修改强>
更新了评论中OP的最终解决方案。
Find: (.+)\t([^,\s]+),([^\t]+)\t(.+)
Replace: \1\t\2\t\4\r\1\t\3\t\4
答案 2 :(得分:0)
我同意stakx的说法,这对于正则表达式来说听起来不是一个好地方。
我会编写一个小程序,它会读取每一行,将行拆分为列,将每个相关列拆分为值列表,然后迭代这些列的所有组合,每次输出一行。
假设只有一列可以有多个令牌,它基本上会是这样的:
while not InputFile.EndOfFile:
line = InputFile.readline();
columns = line.split('\t'); //Assuming 1-based array, so indexes 1-4
col2values = columns[2].split(',');
for each value in col2values:
OutputFile.WriteLine(columns[1]+'\t'+value+'\t'+columns[3]+'\t'+columns[4]);
如果多个列可以有多个值,只需在for each中放入另一个循环。