Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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
C# 如何有效地处理带分隔符的文本文件?_C# - Fatal编程技术网

C# 如何有效地处理带分隔符的文本文件?

C# 如何有效地处理带分隔符的文本文件?,c#,C#,我只是试图对一个特定的文件执行File.ReadAllLines,并对每一行执行|分割。我必须用正则表达式 下面的代码不起作用,但您将看到我正在尝试执行的操作: string[] contents = File.ReadAllLines(filename); string[] splitlines = Regex.Split(contents, '|'); foreach (string split in splitlines) { //Regex line = content.Spli

我只是试图对一个特定的文件执行
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");
}

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), "$|\\|");
  • 您应该将原始字符串传递给
    Regex.Split
    ,而不是数组

  • 在设置前缀时,看起来您使用的是
    line
    而不是
    split
    。如果我不了解你的代码,我无法判断它是否正确,但在任何情况下,它都是错误。(它也不应该构建)

  • 至少在两个层面上,这是一个非常低效的方法:)

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

    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方法。Split不接受字符,并且“|”在正则表达式中有特殊含义,因此除非您转义它,否则它无论如何都不会工作
    • 您多次打开和关闭输出文件。你应该只打开它一次,直到你写完为止。使用关键字的
      在这里很有用
    • 使用WriteLine而不是附加“\r\n”
    • 如果输入文件较大,请使用
      StreamReader
      而不是
      ReadAllLines
    • 如果匹配失败,程序将抛出异常。在使用匹配之前,您可能应该检查
      match.Success
      ,如果返回false,请适当处理错误(跳过行、报告警告、抛出带有适当消息的异常等)
    • 实际上,您没有在正则表达式中使用组1和组2,因此可以删除括号以保存正则表达式引擎,使其不必存储无论如何都不会使用的结果

    根据有限的反馈,我必须假设这就是您所寻找的:

         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
    
    进入一个新文件


    我希望这至少能让你走上正确的道路。我的水晶球越来越模糊了。。haaazzy.

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

    当您说“不工作”时,您的意思是什么?另外,为什么它会读“字符串前缀=前缀=…”?因为您从不创建行字符串,所以它没有意义。即使在您的评论中,行也是一个正则表达式,您不能将其传递给Regex.Split。你想完成什么?你能描述一下你想做什么吗?顺便说一句:如果你打算放弃ReadAllLines,那真的是浪费内存。我很想这样做,但我必须每两次做一个foreach,这可能包括构建一个大约400万次的字符串。是的,不能这样做,这将是一个漫长的过程每个输出行大约4个整数,第二个foreach可能增加2k行。请参阅添加的第二个选项。使用此方法(或类似方法),可以同时按行和“|”字符拆分整个文件。然后像以前一样做你的动作。@Ryan:说得好。他确实明确要求一种有效的方法。