使用正则表达式将逗号分隔值的行拆分为不同的行

时间:2010-05-09 10:01:46

标签: regex csv

我有一个包含很多行的文件。每行都有一列可能包含逗号分隔值。我需要每一行都是不同的(即没有逗号分隔的值)。

以下是一个示例行:

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(.+)

3 个答案:

答案 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中放入另一个循环。