我有一个制表符分隔的文本文件,我必须将其转换为CSV文件,所有这一切都必须通过C#代码完成。我的txt文件非常大(约1.5 GB),因此我想快速转换它。请帮帮我。
答案 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输出写入不同的文件,然后您可以使用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);
答案 1 :(得分:1)
如果您的文件格式严格,可以使用string.Split
和string.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文件,请先搜索或尝试。