WedX - журнал о программировании и компьютерных науках

Как автоматизировать сохранение файлов .csv в файлы .txt с разделителями с помощью C#?

У меня есть около 23 файлов .csv. Я открыл их все в Excel, а затем вручную сохранил их как .txt с разделителями табуляции из Excel. Как мне автоматизировать этот процесс?

Проще говоря, я хочу преобразовать файлы .csv в файлы .txt с разделителями табуляции, используя winform С#, где я могу нажать кнопку и автоматически преобразовать все файлы .csv в моей папке C:\csv\ в файлы .txt с разделителями табуляции. файлы.

Я не решаюсь просто переименовать файлы .csv в файлы .txt, изменив расширение, потому что кажется, что в процессе что-то меняется. Если быть точным, моя программа сталкивается с ошибками при чтении текстового файла, расширение которого было переименовано и изменено на .txt из .csv, но не вызывает ошибок при чтении текстового файла, который был преобразован из .csv в .txt с разделителями с помощью Excel. . Я думаю, это потому, что я сохранил их как текст с разделителями табуляции в Excel.

12.03.2014

Ответы:


1

Это решение предполагает, что все ваши файлы относительно малы и не вызовут 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 дает вам индексатор для значений в каждой строке, но я не совсем уверен, какое свойство вы бы использовали, чтобы получить всю строку массива строк, например, что является целью выше.

12.03.2014
  • гм, это выглядит полезным, почему кто-то понизил бы его до -1? Эван, я забыл упомянуть, что папка может содержать различные типы файлов. как мне убедиться, что только файлы, оканчивающиеся на .csv, .xls или .xlsx, преобразуются в .txt? 13.03.2014
  • @phan это отдельная проблема, но используйте класс DirectoyInfo для получения FileInfo экземпляров для всех файлов в вашем целевом каталоге, а затем вы можете использовать простой запрос LINQ для фильтрации только файлов .csv, .xls и .xlsx . Кроме того, то, что вы делаете для CSV-файлов, не обязательно будет работать для этих форматов Excel. Я не разбираюсь в них, но я уверен, что в файл включено множество метаданных, которые существенно отличают его от эквивалента csv. 13.03.2014
  • Что касается downvoter, я не могу сказать, потому что они не хотели комментировать. У них может быть несколько обоснованных опасений, но, скорее всего, они просто идиоты, потому что этот ответ дает вам основную идею. Да, это не готовое корпоративное программное обеспечение. Нет, я никогда не дам ответ с таким надежным кодом на SO. 13.03.2014
  • @phan один вопрос; могут ли значения в файле содержать запятые? Например, мог бы я иметь что-то вроде val1,"value2, is a sentence, with commas!",val3, потому что это, очевидно, сделало бы так, что код не работает, и если это так, проблема более сложная, и я бы рекомендовал использовать парсер csv. 13.03.2014
  • с головы до ног, я не уверен, но это возможно. я понимаю, что вы заменяете запятые табуляцией и пытаетесь имитировать то, что делает Excel при сохранении данных в виде текста с разделителями. мне интересно, есть ли другой способ просто автоматизировать метод excel для сохранения данных в виде текста с разделителями 13.03.2014
  • @phan, вы, безусловно, могли бы автоматизировать действия Excel, опять же, я думаю, что это намного больше работы, и это был бы странный способ сделать это. Если это так, я бы просто рекомендовал использовать эту библиотеку для чтения файла. Я дам очень краткий пример того, как его использовать; codeproject.com/Articles/9258/A-Fast-CSV-Reader< /а> 13.03.2014

  • 2

    Если вы хотите использовать 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");
    }
    
    13.03.2014
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: wedx@cp9.ru