正则表达式帮助将lst文件转换为csv

时间:2012-04-20 07:53:48

标签: regex export-to-csv

我有从IMDB接口下载的文件(ratings.lst)。内容似乎采用以下格式: -

Distribution   Votes      Rating  Title
0000001222     297339     8.4     Reservoir Dogs (1992)
0000001223     64504      8.4     The Third Man (1949)
0000000115     48173      8.4     Jodaeiye Nader az Simin (2011)
0000001232     324564     8.4     The Prestige (2006)
0000001222     301527     8.4     The Green Mile (1999)

我的目标是将此文件转换为CSV文件(以逗号分隔),并带有以下所需结果(1行示例):

Distribution   Votes      Rating  Title
0000001222,    301527,    8.4,    The Green Mile (1999)

我正在使用textpad,它支持基于正则表达式的搜索和替换。我不确定需要什么类型的正则表达式来实现上述期望的结果。有人可以帮我这个。提前谢谢。

4 个答案:

答案 0 :(得分:0)

  • 按F8打开“替换”对话框
  • 确保选择正则表达式
  • 在查找内容:put:^([[:digit:]]{10})[[:space:]]+([[:digit:]]+)[[:space:]]+([[:digit:]]- {1,2}\.[[:digit:]])[[:space:]]+(.*)$
  • 在替换为:put \1,\2,\3,"\4"
  • 点击全部替换

enter image description here

注意:这在来自ratings.lst的字段之间使用了1个或多个空格 - 如果您知道空格,最好指定确切的空格数。

另请注意:我没有在逗号分隔的项目之间添加空格,因为通常你没有,但可以随意添加空格

最后注意:我将电影标题放在引号中,这样如果它包含逗号,则不会破坏CSV格式。您可能希望以不同方式处理此问题。

答案 1 :(得分:0)

首先用"替换所有""然后执行此操作:

查找:^\([0-9]+\)[ \t]+\([0-9]+\)[ \t]+\([^ \t]+\)[ \t]+\(.*\)
替换为:\1,\2,\3,"\4"

答案 2 :(得分:0)

MY BAD 这是一个C#程序。我将把它留给备用解决方案。

ignorepattern空格用于注释模式。

这将创建可放入CSV文件的数据。注意根据您的示例,CSV文件中没有可选的whitepsace ....

string data =@"Distribution   Votes      Rating  Title
0000001222     297339     8.4     Reservoir Dogs (1992)
0000001223     64504      8.4     The Third Man (1949)
0000000115     48173      8.4     Jodaeiye Nader az Simin (2011)
0000001232     324564     8.4     The Prestige (2006)
0000001222     301527     8.4     The Green Mile (1999)
";

string pattern = @"
^                     # Always start at the Beginning of line
(                     # Grouping
   (?<Value>[^\s]+)     # Place all text into Value named capture
   (?:\s+)              # Match but don't capture 1 to many spaces
){3}                  # 3 groups of data
(?<Value>[^\n\r]+)    # Append final to value named capture group of the match
";

var result = Regex.Matches(data, pattern, RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace)
                  .OfType<Match>()
                  .Select (mt => string.Join(",", mt.Groups["Value"].Captures
                                                                    .OfType<Capture>()
                                                                    .Select (c => c.Value))
                                                                    );

Console.WriteLine (result);

/* output
Distribution,Votes,Rating,Title
0000001222,297339,8.4,Reservoir Dogs (1992)
0000001223,64504,8.4,The Third Man (1949)
0000000115,48173,8.4,Jodaeiye Nader az Simin (2011)
0000001232,324564,8.4,The Prestige (2006)
0000001222,301527,8.4,The Green Mile (1999)
*/

答案 3 :(得分:0)

其他正则表达式有些过于复杂。由于保证空白不会出现在前三列中,因此您不必进行花哨的匹配 - “由whitepace分隔的任何三列”都可以。

尝试用^(.+?)\s+(.+?)\s+(.+?)\s+(.+?)$替换\1,\2,\3,"\4",提供以下输出(使用Notepad ++)

Distribution,Votes,Rating,"Title"
0000001222,297339,8.4,"Reservoir Dogs (1992)"
0000001223,64504,8.4,"The Third Man (1949)"
0000000115,48173,8.4,"Jodaeiye Nader az Simin (2011)"
0000001232,324564,8.4,"The Prestige (2006)"
0000001222,301527,8.4,"The Green Mile (1999)"

请注意使用非贪婪量词.+?来防止意外匹配超出我们应有的范围。另请注意,如果电影标题中出现逗号,我会在第四列附带引号"" - 否则您用来阅读文件的软件会将Avatar, the Last Airbender解释为两列。

漂亮的表格对齐已经消失 - 但是如果你在Excel中打开文件它看起来会很好。

Alternately, just do the entire thing in Excel.