如何有效地处理分隔的文本文件?

时间:2010-01-22 17:44:47

标签: c#

我只是尝试针对特定文件执行File.ReadAllLines,并且对于每一行,都会在|上进行拆分。我必须在这个上使用正则表达式。

下面的代码不起作用,但你会看到我正在尝试做的事情:

string[] contents = File.ReadAllLines(filename);
string[] splitlines = Regex.Split(contents, '|');
foreach (string split in splitlines)
{
    //Regex line = content.Split('|');
    //content.Split('|');
    string prefix = prefix = Regex.Match(line, @"(\S+)(\d+)").Groups[0].Value;
    File.AppendAllText(workingdirform2 + "configuration.txt", prefix+"\r\n");
}

5 个答案:

答案 0 :(得分:1)

我并不完全清楚你要做什么,但你的代码中有很多错误。我试图猜测你在做什么,但如果这不是你想要的,请用一些例子解释你最想要的东西:

string inputFilename = "input.txt";
string outputFilename = "output.txt";

using (StreamWriter streamWriter = File.AppendText(outputFilename))
{
    using (StreamReader streamReader = File.OpenText(inputFilename))
    {
        while (true)
        {
            string line = streamReader.ReadLine();

            if (line == null)
            {
                break;
            }

            string[] splitlines = line.Split('|');
            foreach (string split in splitlines)
            {
                Match match = Regex.Match(split, @"\S+\d+");
                if (match.Success)
                {
                    string prefix = match.Groups[0].Value;
                    streamWriter.WriteLine(prefix);
                }
                else
                {
                    // Handle match failed...
                }
            }
        }
    }
}

关键点:

  • 您似乎想要在每一行上执行操作,因此您需要遍历这些行。
  • 如果要拆分单个字符,请使用简单的string.Split方法。 Regex.Split不接受字符和“|”在正则表达式中具有特殊含义,因此除非您将其转义,否则它将无法工作。
  • 您多次打开和关闭输出文件。您应该只打开一次并保持打开状态,直到您完成写入。 using关键字在这里非常有用。
  • 使用WriteLine而不是附加“\ r \ n”。
  • 如果输入文件很大,请使用StreamReader代替ReadAllLines
  • 如果匹配失败,您的程序将抛出异​​常。您可能应该在使用匹配之前检查match.Success,如果返回false,则适当地处理错误(跳过该行,报告警告,发出包含相应消息的异常等)。
  • 您实际上并未在正则表达式中使用第1组和第2组,因此您可以删除括号以保存正则表达式引擎,使其不必存储您不会使用的结果。

答案 1 :(得分:0)

Regex.Split采用字符串,而不是字符串数组。

我建议分别在每个内容项上调用Regex.Split,然后循环调用该调用的结果。这意味着嵌套for循环。

string[] contents = File.ReadAllLines(filename);
foreach (string line in contents)
{
    string[] splitlines = Regex.Split(line);
    foreach (string splitline in splitlines)
    {
        string prefix = Regex.Match(splitline, @"(\S+)(\d+)").Groups[0].Value;
        File.AppendAllText(workingdirform2 + "configuration.txt", prefix+"\r\n");
    }
}

这当然不是最有效的方法。

更有效的方法可能是拆分正则表达式。我认为这有效:

string splitlines = Regex.Split(File.ReadAllText(filename), "$|\\|");

答案 2 :(得分:0)

  1. 您应该将原始字符串传递给Regex.Split而不是数组。

  2. 设置前缀时,您似乎正在使用line而不是split。在不知道更多关于你的代码的情况下,我无法判断它是否正确,但无论如何它都是错误的。(它不应该构建)

  3. 至少在两个级别上这是非常低效的:)

答案 3 :(得分:0)

我必须假设,根据有限的反馈,这是你正在寻找的:

     string inputFile = filename;
     string outputFile = Path.Combine( workingdirform2, "configuration.txt" );
     using ( StreamReader inputFileStream = File.OpenText( inputFile ) ) 
     {           
        using ( StreamWriter ouputFileStream =  File.AppendText( outputFile )  )
        {
           // Iterate over the file contents to extract the prefix
           string currentLine;
           while ( ( currentLine = inputFileStream.ReadLine() ) != null )
           {
              // Notice the updated Regex - your's is a bit broken
              string prefix = Regex.Match( currentLine, @"^(\S+?)\d+" ).Groups[1].Value;
              ouputFileStream.WriteLine( prefix );
           }
        }
     }

这将需要一个文件:

Text1231|abc|abc
Text1232|abc|abc
Text1233|abc|abc
Text1234|abc|abc

并放置:

Text
Text
Text
Text

进入新文件。

我希望至少能让你走上正确的道路。我的水晶球变得朦胧.. haaazzzy ..

答案 4 :(得分:0)

在C#中处理文本文件的最佳方法之一可能是使用fileHelpers。看看吧。它允许您强烈键入导入数据。