-3

可能重复:
如何将制表符分隔的文件转换为 CSV 文件

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

4

3 回答 3

5

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

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 输出写入不同的文件,然后您可以使用StreamReader并且StreamWriter一次只能使用 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);
于 2013-02-01T10:48:12.123 回答
1

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

var lines = File.ReadAllLines(path);
var newLines = lines.Select(l => string.Join(",", l.Split('\t')));
File.WriteAllLines(path, newLines);
于 2013-02-01T10:21:23.657 回答
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 文件的内容,请先搜索或尝试一下。

于 2013-02-01T10:22:08.793 回答