可能重复:
如何将制表符分隔的文件转换为 CSV 文件
我有一个制表符分隔的文本文件,我必须将其转换为 CSV 文件,所有这些都必须通过 C# 代码完成。我的 txt 文件非常大(1.5 GB),因此我想快速转换它。请帮我。
可能重复:
如何将制表符分隔的文件转换为 CSV 文件
我有一个制表符分隔的文本文件,我必须将其转换为 CSV 文件,所有这些都必须通过 C# 代码完成。我的 txt 文件非常大(1.5 GB),因此我想快速转换它。请帮我。
如果您的输入制表符分隔的文本文件没有任何逗号是数据的一部分,那么它是一个非常简单的查找和替换,类似于此处的其他答案:
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);
如果您的文件格式很严格,您可以使用string.Split
and string.Join
:
var lines = File.ReadAllLines(path);
var newLines = lines.Select(l => string.Join(",", l.Split('\t')));
File.WriteAllLines(path, newLines);
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 文件的内容,请先搜索或尝试一下。