#c# #csv
Вопрос:
Я пытаюсь прочитать несколько файлов CSV в каталоге, обработать и соответствующим образом отфильтровать их на основе определенного префикса с помощью c #. Затем я хочу записать каждую строку в новый CSV-файл, содержащий этот префикс. Заголовок CSV остается прежним.
Например, у меня есть CSV-файл перед обработкой как таковой:
Если в строке есть префикс, начинающийся с BAK, в качестве примера я хочу извлечь все строки данных в новый CSV-файл с этим префиксом, чтобы мой CSV-файл выглядел следующим образом. Обратите внимание, что префикс не всегда может находиться в одном и том же месте.
CSV после обработки:
Я просмотрел другие вопросы и ответы и чувствую, что они не касаются моего вопроса.
Что у меня есть до сих пор (C #):
static void Main(string[] args) {
string sourceDirectory = @"C:tempcsvfiles";
var csvFiles = Directory.EnumerateFiles(sourceDirectory, "*.csv", SearchOption.AllDirectories);
foreach (string currentFile in csvFiles) {
//How do I read in only the specfic rows that I need containing certain prefixes
}
}
Редактировать 28/10/21
Теперь я могу читать несколько файлов на основе префикса. При записи строк в новый файл csv записывается только первая строка из первого тестового файла в каталоге, но не вторая.
try
{
string sourceDirectory = @"C:tempcsvfiles";
string path = @"C:tempcsvfilestestdone.csv";
var csvFiles = Directory.EnumerateFiles(sourceDirectory, "*.csv", SearchOption.AllDirectories);
foreach (string currentFile in csvFiles)
{
//How do I read in only the specfic rows that I need containing certain prefixes
foreach (string line in File.ReadAllLines(currentFile).Where(m => m.Split(';').Last().Contains("GFP")))
{
// Create and write the csv file
File.WriteAllText(path, line.ToString());
}
}
}
Комментарии:
1. 1. Вы не можете читать только строки, содержащие префикс, потому что вам нужно прочитать строку, чтобы узнать, что в ней. Я предлагаю вам прочитать все строки, а затем отфильтровать их, используя что-то вроде
IndexOf
илиContains
. 2. Я не советую писать собственную логику синтаксического анализа CSV, поскольку это сложнее, чем кажется. Используйте проверенную библиотеку CSV.
Ответ №1:
Вам нужно будет прочитать и проанализировать каждую строку вашего входного файла, а затем проверить данные, чтобы определить, следует ли их записывать в выходной файл.
Я не знаю, какой у вас опыт разбора CSV-файлов. Есть много доступных, которые могли бы быстро справиться с этим. Могу ли я порекомендовать свой собственный CsvParser?
Ответ №2:
static void Main(string[] args)
{
string sourceDirectory = @"C:tempcsvfiles";
var csvFiles = Directory.EnumerateFiles(sourceDirectory, "*.csv", SearchOption.AllDirectories);
foreach (string currentFile in csvFiles)
{
//How do I read in only the specfic rows that I need containing certain prefixes
foreach (string line in File.ReadAllLines(currentFile).Where(m => m.Split(';').Last().Contains("BAK")))
{
Console.WriteLine(line);
}
}
}
Обновление 1: записать все строки в новый файл
string sourceDirectory = @"C:tempcsvfiles";
string path = @"C:tempcsvfilestestdone.csv";
var csvFiles = Directory.EnumerateFiles(sourceDirectory, "*.csv", SearchOption.AllDirectories);
foreach (string currentFile in csvFiles)
{
//How do I read in only the specfic rows that I need containing certain prefixes
foreach (string line in File.ReadAllLines(currentFile).Where(m => m.Split(';').Last().Contains("bak")))
{
Console.WriteLine(line);
File.AppendAllText(path, line Environment.NewLine);
}
}
Комментарии:
1. Спасибо. Я не уверен, почему этот ответ был отмечен. Теперь выполняется фильтрация по строке, содержащей только BAK. Теперь мне просто нужно записать эти конкретные строки в новый CSV-файл
2. см. Обновление 1, отрегулируйте содержание, хотите ли вы заглавные буквы…