如何使用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中以制表符分隔的文本

如何使用c#自动保存.csv文件到分隔符.txt文件

此解决方案假设您的文件都相对较小,并且如果一次将整个文件加载到内存中,则不会导致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");
}