首页 > 解决方案 > 从C#中的特定行删除回车符

问题描述

我在文本文件(csv)中有这种类型的数据:

column1|column2|column3|column4|column5 (\r\n)
column1|column2|column3|column4|column5 (\r\n)
column1|column2 (\r\n)
column2 (\r\n)
column2|column3|column4|column5 (\r\n)

我想删除第 3 行和第 4 行的 \r\n :

column1|column2|column3|column4|column5 (\r\n)
column1|column2|column3|column4|column5 (\r\n)
column1|column2/column2/column2|column3|column4|column5 (\r\n)

我的想法是,如果该行没有 4 个列分隔符(“|”),则删除 CRLF,并重复该操作,直到只有正确的行。

这是我的代码:

String path = "test.csv";

// Read file
string[] readText = File.ReadAllLines(path);

// Empty the file
File.WriteAllText(path, String.Empty);

int x = 0;
int countheaders = 0;
int countlines;
using (StreamWriter writer = new StreamWriter(path))
{
    foreach (string s in readText)
    {
        if (x == 0)
        {
            countheaders = s.Where(c => c == '|').Count();
            x = 1;
        }

        countlines = 0;
        countlines = s.Where(d => d == '|').Count();
        if (countlines == countheaders)
        {
            writer.WriteLine(s);
        }
        else
        {
            string s2 = s;
            s2 = s2.ToString().TrimEnd('\r', '\n');
            writer.Write(s2);
        }
    }
}

问题是我一次性读取文件,所以第 4 行的换行符被删除,第 4 行和第 5 行在一起......

标签: c#stringnewlinefilestreamcarriage-return

解决方案


您可能可以执行以下操作(现在无法测试,但应该可以):

IEnumerable<string> batchValuesIn(
    IEnumerable<string> source, 
    string separator,
    int size)
{
    var counter = 0;
    var buffer = new StringBuilder();

    foreach (var line in  source)
    {
        var values = line.Split(separator);

        if (line.Length != 0)
        {
            foreach (var value in values)
            {
                buffer.Append(value);
                counter++;

                if (counter % size == 0)
                {
                    yield return buffer.ToString();
                    buffer.Clear();
                }
                else
                   buffer.Append(separator);
            }
        }
    }

    if (buffer.Length != 0)
       yield return buffer.ToString();

你会像这样使用它:

var newLines = batchValuesIn(File.ReadLines(path), "|", 5);

这个解决方案的好处是您永远不会将整个原始源加载到内存中。您只需即时构建线条。

免责声明:这对于格式错误的输入字符串可能会表现得很奇怪。


推荐阅读