Это решение предполагает, что все ваши файлы относительно малы и не вызовут 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>();
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
DirectoyInfo
для полученияFileInfo
экземпляров для всех файлов в вашем целевом каталоге, а затем вы можете использовать простой запрос LINQ для фильтрации только файлов .csv, .xls и .xlsx . Кроме того, то, что вы делаете для CSV-файлов, не обязательно будет работать для этих форматов Excel. Я не разбираюсь в них, но я уверен, что в файл включено множество метаданных, которые существенно отличают его от эквивалента csv. 13.03.2014val1,"value2, is a sentence, with commas!",val3
, потому что это, очевидно, сделало бы так, что код не работает, и если это так, проблема более сложная, и я бы рекомендовал использовать парсер csv. 13.03.2014