将制表符分隔文件转换为c#中的CSV文件

时间:2013-02-01 10:19:15

标签: c#

  

可能重复:
  How to covert tab separated file to CSV file

我有一个制表符分隔的文本文件,我必须将其转换为CSV文件,所有这一切都必须通过C#代码完成。我的txt文件非常大(约1.5 GB),因此我想快速转换它。请帮帮我。

3 个答案:

答案 0 :(得分:3)

如果您的输入制表符分隔文本文件没有任何逗号是数据的一部分,那么这是一个非常简单的查找和替换类似于其他答案:

var lines = File.ReadAllLines(path);
var csv= lines.Select(row => string.Join(",", row.Split('\t')));
File.WriteAllLines(path, csv);

但是如果您的数据有逗号,那么这样做会打破您的列,因为您现在有额外的逗号,这些逗号不应该是分隔符,但会被解释为这样。如何处理它在很大程度上取决于您将用于阅读CSV的应用程序。

Microsoft Excel兼容CSV将在带有逗号的字段周围加上双引号,以确保它们被解释为数据而不是分隔符。这也意味着包含双引号作为数据的字段需要特殊处理。

我建议使用扩展方法采用类似的方法。

var input = File.ReadAllLines(path);
var lines = input.Select(row => row.Split('\t'));
lines = lines.Select(row => row.Select(field => field.EscapeCsvField(',', '"')).ToArray());
var csv = lines.Select(row => string.Join(",", row));
File.WriteAllLines(path, csv.ToArray());

这是EscapeCsvField扩展方法:

static class Extension
{
    public static String EscapeCsvField(this String source, Char delimiter, Char escapeChar)
    {
        if (source.Contains(delimiter) || source.Contains(escapeChar))
            return String.Format("{0}{1}{0}", escapeChar, source);

        return source;
    }
}

此外,如果文件很大,最好不要将整个文件读入内存。在这种情况下,我建议将CSV输出写入不同的文件,然后您可以使用StreamReaderStreamWriter一次仅使用1行。

var tabPath = path;
var csvPath = Path.Combine(
                Path.GetDirectoryName(path), 
                String.Format("{0}.{1}", Path.GetFileNameWithoutExtension(path), "csv"));

using (var sr = new StreamReader(tabPath))
using (var sw = new StreamWriter(csvPath, false))
{
    while (!sr.EndOfStream)
    {
        var line = sr.ReadLine().Split('\t').Select(field => field.EscapeCsvField(',', '"')).ToArray();
        var csv = String.Join(",", line);
        sw.WriteLine(csv);
    }
}

File.Delete(tabPath);

答案 1 :(得分:1)

如果您的文件格式严格,可以使用string.Splitstring.Join

var lines = File.ReadAllLines(path);
var newLines = lines.Select(l => string.Join(",", l.Split('\t')));
File.WriteAllLines(path, newLines);

答案 2 :(得分:1)

var csv = File.ReadAllLines("Path").Select(line => line.Replace("\t", ","));

您可以直接致电

public void ConvertToCSV(string strPath, string strOutput)
{
  File.WriteAllLines(strOutput, File.ReadAllLines("Path").Select(line => line.Replace("\t", ",")));
}

SO上已有很多内容用于处理.CSV文件,请先搜索或尝试。