我有大约23个.csv文件。我在Excel中打开它们,然后从Excel中手动将它们保存为制表符分隔的.txt。如何自动完成此过程?
简单地说,我想使用C#winform将.csv文件转换为制表符分隔的.txt文件,我可以在其中按下按钮并将我的C:\ csv \文件夹中的所有.csv文件自动转换为制表符分隔.txt文件。
我对通过更改扩展名将.csv文件重命名为.txt文件犹豫不决,因为似乎某些内容在此过程中发生了变化。确切地说,我的程序在读取文本文件时遇到错误,该文件的扩展名已重命名并从.csv更改为.txt,但在读取已从.csv转换为分隔.txt的文本文件时不会遇到错误。我认为这是因为我将它们保存为Excel中的制表符分隔文本。
答案 0 :(得分:0)
此解决方案假设您的文件都相对较小,如果整个文件一次加载到内存中,则不会导致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格式,则没有理由不起作用。
编辑:结合更多事物;首先,我更新了示例代码,因此它使用目录路径作为起点,并从那里获取所有文件。其次,只是不想,如果你的文件对于这个解决方案而言太大,请在同一个foreach循环中使用StreamReader / StreamWriter。 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
类为每行中的值提供了一个索引器,但是我不确定使用哪个属性来将整行作为字符串数组,例如上面的意图。
答案 1 :(得分:0)
如果您愿意使用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");
}