从csv字段有效地替换不需要的分隔符

时间:2017-08-25 14:41:29

标签: c# csv

作为输入,我有一个约1,000,000行(约300Mb)的csv文件,其中包含以分号分隔的列。

colA;colB;colC;colD;colE
aaaa;bbbb;cccc;dddd;"eeee;"
aaaa;bbbb;cccc;dddd;evfvdfeee
aaaa;bb1bb;cc2cc;dd3dd;evfve

第5列的某些字段可能有一个分号。虽然不是全部。所以,我想在第4次发生后删除所有的分号。下面的代码有效,但将csv保存到文件需要很长时间(约10分钟)。我怎样才能加快这个速度?

void Main()
{

    string finput = @"myfile.csv";
    FileInfo finfo = new FileInfo(finput);

    var Lines = File.ReadLines(finfo.FullName);
    List<string> output = new List<string>();
    Stopwatch sw = new Stopwatch();
    sw.Start();

    int count = 0;

        foreach (string s in Lines)
        {
            count++;
            if (count % 10000 == 0)
                count.Dump();

          output.Add((StringExtender.ReplaceAfterNthOccurrency(s, ";", ".", 5)));
    }
    sw.Elapsed.Dump();

    File.WriteAllLines(finfo.DirectoryName + finfo.Name + "_conv.csv", output);
}

public static class StringExtender
{
    public static string ReplaceAfterNthOccurrency(string input, string to_replace, string to_add, int n)
    {

        var cont = true;
        int count = 0;
        int start = 0;
        while (cont)
        {
            int i = input.IndexOf(to_replace, start);

            if (i != -1)
            {
                count++;
                start = i + 1;
                if (count >= n)
                {
                    input = input.Remove(i, 1);
                    input = input.Insert(i, to_add);
                }
            }
            else
                cont = false;

        }
        return input;

    }
}

0 个答案:

没有答案