如何使用C#自动将.csv文件保存到分隔的.text文件?

时间:2014-03-12 23:22:33

标签: c# excel csv

我有大约23个.csv文件。我在Excel中打开它们,然后从Excel中手动将它们保存为制表符分隔的.txt。如何自动完成此过程?

简单地说,我想使用C#winform将.csv文件转换为制表符分隔的.txt文件,我可以在其中按下按钮并将我的C:\ csv \文件夹中的所有.csv文件自动转换为制表符分隔.txt文件。

我对通过更改扩展名将.csv文件重命名为.txt文件犹豫不决,因为似乎某些内容在此过程中发生了变化。确切地说,我的程序在读取文本文件时遇到错误,该文件的扩展名已重命名并从.csv更改为.txt,但在读取已从.csv转换为分隔.txt的文本文件时不会遇到错误。我认为这是因为我将它们保存为Excel中的制表符分隔文本。

2 个答案:

答案 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);
    }
}

部分来自DotNetPerlsVbCity以及我自己对Interop的回忆。这是用文本文件编写的,可能无法编译或正常工作,但应该让你开始。

你会用

之类的东西来称呼它
using(ExcelInterop excelInterop = new ExcelInterop())
{
    excelInterop.ConvertDirectoryOfCsvFilesToTxt("C:\\csv", "C:\\txt");
}