C# 从文件中删除不必要的换行符

C# 从文件中删除不必要的换行符,c#,regex,C#,Regex,我正在读一个C代码的输入文本文件。文件的列分隔符为“|”,行分隔符为“\n”。以下是测试数据- 1001 | Name | XYZ | Department1 Roll no 1. (\r\n) 1002 | Name | ABC | Department2 Roll No 2. (\r\n) 1003 | Name | PQR | Department3 (\r\n) Roll (\r\n) no3. (\r\n) 1004 | Name | MNO | Department4 Roll No

我正在读一个C代码的输入文本文件。文件的列分隔符为“|”,行分隔符为“\n”。以下是测试数据-

1001 | Name | XYZ | Department1 Roll no 1. (\r\n)
1002 | Name | ABC | Department2 Roll No 2. (\r\n)
1003 | Name | PQR | Department3 (\r\n)
Roll (\r\n)
no3. (\r\n)
1004 | Name | MNO | Department4 Roll No 4. (\r\n)
1005 | Name | DEF | Department5 Roll No 5. (\r\n)
前两条记录的格式正确。但是,第三条记录插入错误。我想按照我的其他记录格式化它

我已经为此编写了C#代码,如下所示-

string text = File.ReadAllText(inputfile);
text = text.Replace(@"\r\n", " ");
File.WriteAllText(ouutputfile, text);
然而,这对我不起作用。有人能帮我解决这个问题吗

更多样本数据-

我们可以为它使用一个正则表达式吗?

var text=File.ReadAllText(inputfile);
var text = File.ReadAllText(inputfile);
var rawParts = text.Split(new string[] { "\n" });
var proParts = new List<string>(rawParts.Take(2));
proParts.Add(rawParts[2] + " " rawParts[3] + " " rawParts[4]);
proParts.AddRange(rawParts.Skip(5));
var sb = new StringBuilder();
foreach (var part in proParts)
  sb.Append(part + "\n");
File.WriteAllText(outputfile, sb.ToString());
var rawParts=text.Split(新字符串[]{“\n”}); var proParts=新列表(rawParts.Take(2)); proParts.Add(rawParts[2]+“rawParts[3]+”rawParts[4]); proParts.AddRange(rawParts.Skip(5)); var sb=新的StringBuilder(); foreach(proParts中的var部分) sb.附加(部分+“\n”); writealText(outputfile,sb.ToString());
如Sergii所述,使用
File.ReadAllLines
反向处理。这将允许您检查每一行,查看它是否与预期格式匹配,或者该行是否是由于不正确的换行而创建的。如果当前行是放错了换行符的结果,则可以简单地将其附加到上一行以获得结果输出

static void ProcessFile(string inputfile, string outputfile)
{
    // Read the files by lines.
    string[] lines = File.ReadAllLines(inputfile);

    // We'll process in reverse, so create a stack (LIFO) for the results.
    Stack<string> results = new Stack<string>();

    // Process each line, checking that if it doesn't match the format, then we append to previous line.
    string resultLine = "";
    for (int i = lines.Length - 1; i >= 0; --i)
    {
        resultLine = lines[i] + resultLine;
        int lineParts = resultLine.Split('|').Count();
        if (lineParts == 4) // Well-formatted line.
        {
            results.Push(resultLine);
            resultLine = "";
        }
        else if (lineParts < 4) // An invalid linefeed from the previous entry.
        {
            // We prepend a space to replace the linebreak; then just continue through loop, where the current line will be appended to previous.
            resultLine = " " + resultLine;
        }
        else // lineParts > 4... unexpected
        {
            throw new InvalidOperationException("What to do here?");
        }
    }

    // Now that all our lines have been fixed, write them back out.
    File.WriteAllLines(outputfile, results.ToArray());
}
静态void进程文件(字符串输入文件、字符串输出文件)
{
//逐行读取文件。
string[]lines=File.ReadAllLines(inputfile);
//我们将反向处理,因此为结果创建一个堆栈(LIFO)。
堆栈结果=新堆栈();
//处理每一行,检查是否与格式不匹配,然后追加到前一行。
字符串resultLine=“”;
对于(int i=行。长度-1;i>=0;--i)
{
结果行=行[i]+结果行;
int lineParts=resultLine.Split(“|”).Count();
if(lineParts==4)//格式良好的行。
{
结果:推送(结果线);
结果行=”;
}
else if(lineParts<4)//上一个条目的换行无效。
{
//我们在前面加了一个空格来替换换行符;然后继续循环,当前行将附加到前面的换行符。
resultLine=“”+resultLine;
}
else//lineParts>4…意外
{
抛出新的InvalidOperationException(“在这里做什么?”);
}
}
//现在我们所有的行都已经修好了,把它们写下来。
writeAllines(outputfile,results.ToArray());
}

注意:这并不是最有效的,因为您必须确保要处理的文件足够小,可以在内存中存储3次,但这只比原始解决方案多1倍。如果您的文件很大,您可能会想修改解决方案以在流上操作,而不是保留所有的局部变量。

听起来您的问题是“如何使用C#从文本文件中删除换行符”(顺便说一句,如果您用谷歌搜索它,我肯定以前已经回答过这个问题)。我不想删除所有换行符。有两件事:1)你说文件中有“\n”但没有提到“\r”那么你为什么要替换它们?2) 你有什么逻辑来确定哪些要更换,哪些不需要?我假设不应该删除行分隔符…请使用而不是ReadAllText。它将返回所有行,然后您可以处理它们。检查行的格式是否正确,并将其与前一行合并,如果未按您的要求进行格式设置,您还需要帮助吗?您尚未接受答案。我认为OP需要更通用的方法来解决此问题,而不是使用Regex.Split(text,@“\r\n”);硬编码的“一次性”使用方法;。仍然没有幸运的事:TDD多少?