如何使用c#自动保存.csv文件到分隔符.txt文件
本文关键字:文件 分隔符 txt csv 保存 何使用 | 更新日期: 2023-09-27 17:49:44
我有大约23个。csv文件。我在Excel中打开它们,然后在Excel中手动将它们保存为tab分隔的。txt格式。我该如何自动化这个过程呢?
简单地说,我想使用c# winform将。csv文件转换成以制表符分隔的。txt文件,在那里我可以按一个按钮,并在我的C:'csv'文件夹中的所有。csv文件自动转换成以制表符分隔的。txt文件。
我对简单地通过更改扩展名将。csv文件重命名为。txt文件犹豫不决,因为似乎在这个过程中有些事情发生了变化。确切地说,我的程序在读取扩展名被重命名并从。csv更改为。txt的文本文件时出现错误,但在读取已被Excel从。csv转换为带分隔符的。txt的文本文件时没有出现错误。我想这是因为我把它们保存为Excel中以制表符分隔的文本
此解决方案假设您的文件都相对较小,并且如果一次将整个文件加载到内存中,则不会导致OutOfMemoryExceptions
。
DirectoryInfo dir = new DirectoryInfo(@"C:'path'to'root");
FileInfo[] files = dir.GetFiles();
foreach (string path in files.Where(x => x.Extension == "csv").Select(x => x.FullName))
{
string input = File.ReadAllText(path);
File.WriteAllText(input.Replace(',', ''t')
}
最后一段也要注意几点;csv文件和txt文件没有区别。它们都是纯文本文件。csv代表"逗号分隔值",我可以有一个技术上是"csv"的文本文件,也可以有一个内容实际上不是这种格式的。csv文件。更改扩展名不会神奇地使逗号重写为制表符,但如果您的代码可以读取原始csv格式,则没有理由不工作。
编辑:还有几件事;首先,我更新了示例代码,使其使用目录路径作为起点,并从那里获取所有文件。其次,只是想不要,如果你的文件太大,这个解决方案使用StreamReader/StreamWriter在同一个foreach循环。msdn有一个足够的例子,所以我不会在这里发布任何东西,你只需要一行一行地阅读文件,用制表符替换逗号,将该行写入输出文件。
使用csv阅读器进行更健壮的转换;
using System.IO;
using LumenWorks.Framework.IO.Csv;
List<string> output = new List<string>();
// open the file "data.csv" which is a CSV file with headers
using (CsvReader csv =
new CsvReader(new StreamReader("data.csv"), true))
{
int fieldCount = csv.FieldCount;
string[] headers = csv.GetFieldHeaders();
while (csv.ReadNextRecord())
{
output.Add(String.Join("'t", csv.NotSureWhatThisPropertyNameShouldBe));
}
}
CsvReader
类为您提供了每行值的索引器,但我不确定您将使用什么属性来获得整行字符串数组,例如,这是上面的意图。
如果您愿意使用Interop:
using Microsoft.Office.Interop.Excel;
using System.IO;
using System;
public class ExcelInterop : IDisposable
{
private Application _excelApplication;
public ExcelInterop()
{
_excelApplication = new Application();
}
public void ConvertDirectoryOfCsvFilesToTxt(string inputFolder, string outputFolder)
{
var files = Directory.GetFiles(seasonPath).Where(f => !f.EndsWith(".csv")).ToList();
foreach(string file in files)
{
string outFilePath = Path.Combine(outputFolder, Path.GetFileNameWithoutExtension(file) + ".txt";
ConvertCsvToTxt(file, outFilePath));
}
}
private void ConvertCsvToTxt(string inputFilePath, string outputFilePath)
{
Workbook workbook = _excelApp.Workbooks.Open(inputFilePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
workbook.SaveAs(outputFilePath, XlFileFormat.xlCurrentPlatformText, Type.Missing, Type.Missing, false);
workbook.Close();
Marshal.ReleaseComObject(workbook);
}
public void Dispose()
{
_excelApplication.Quit();
Marshal.ReleaseComObject(_excelApplication);
}
}
部分基于DotNetPerls和VbCity加上我自己对Interop的回忆。这是在一个文本文件中编写的,可能无法正确编译或工作,但应该可以让您开始。
你可以用类似
这样的方式来调用它using(ExcelInterop excelInterop = new ExcelInterop())
{
excelInterop.ConvertDirectoryOfCsvFilesToTxt("C:''csv", "C:''txt");
}