Извлечение определенных строк в файле CSV на основе определенного префикса

#c# #csv

Вопрос:

Я пытаюсь прочитать несколько файлов CSV в каталоге, обработать и соответствующим образом отфильтровать их на основе определенного префикса с помощью c #. Затем я хочу записать каждую строку в новый CSV-файл, содержащий этот префикс. Заголовок CSV остается прежним.

Например, у меня есть CSV-файл перед обработкой как таковой:

CSV перед обработкой

Если в строке есть префикс, начинающийся с BAK, в качестве примера я хочу извлечь все строки данных в новый CSV-файл с этим префиксом, чтобы мой 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, отрегулируйте содержание, хотите ли вы заглавные буквы…