Найдите строку из текстового файла и скопируйте ее в новый текстовый файл, используя c # - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть текстовый файл журнала, и я хочу сделать его резюме. Ниже приведен мой пример текстового файла журнала.

Date        |ID    |Folder               |Doc   |FileName   |NoOfAcct| 
20181024    |1     |ABC.20181101.CGLOG   |test  |xxxx       |12
20181024    |2     |CDE.20181013.CGLOG   |home  |XyyX       |2
20181024    |3     |WQE.20181013.CGLOG   |office|xy         |5
20181024    |4     |ABC.20181013.CGLOG   |store |yy         |10

Я хочу сделать сводку об этом и отделить ( группу ) от Folder и ID. Например, я хочу скопировать Folder ABC.20181101.CGLOG с ID номером 1 в новый текстовый файл . Я делаю код, но я застрял в нем.

using System;
using System.IO;

namespace HLB
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            string path1 = "";                
            if (path1 == "")
                path1 = "F:\\Work\\FLP Code\\test\\log_test.txt";            
            string[] strArray1 = File.ReadAllLines(path1);
            string fileName = Path.GetFileName(path1);
            string directoryName = Path.GetDirectoryName(path1);
            if (fileName.Contains("%ABC%"))
            {
                Console.WriteLine("Test!");
            }
        }
    }
}

Может ли кто-нибудь помочь мне привести пример для меня? Заранее спасибо.

Привет всем, ниже мой новый код:

using System;
using System.IO;
using System.Linq;

namespace HLB
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            // Our initial data
            string path1 = "";
            if (path1 == "")
                path1 = "F:\\Work\\FLP Code\\test\\log_test.txt";
            var data = File
            .ReadLines(path1)
            .Skip(1) // Skip 1st record (header)
            .Where(line => !string.IsNullOrWhiteSpace(line)) // remove empty lines, if any 
            .Select(line => line.Split('|'))                 // split each line by |
            .Select(items => new {
                Raw = string.Join("|", items),               // Raw data as it is in the file

                Date = items[0].Trim(),
                ID = items[1].Trim(),
                Folder = items[2].Trim(),
                Doc = items[3].Trim(),
                FileName = items[4].Trim(),
                NoOfAct = items[5].Trim(),
            });

                // Now, it's quite easy to represent the data as we want.
                // And we want to *group by* `Folder` and `ID`: just one GroupBy operation
                var result = data
                    .GroupBy(item => new {
                        ID = item.ID,
                        Folder = item.Folder
                    })
                    .Select(chunk =>
                    $"File {chunk.Key.Folder + "_" + chunk.Key.ID}.txt :\r\n  {string.Join(Environment.NewLine + "  ", chunk.Select(item => item.Raw))}");

                foreach (var record in result)
                    Console.WriteLine(record);

            File.WriteAllLines(@"F:\\Work\\FLP Code\\test\\MyNewTextFile.txt", data
            .Where(item => item.ID == "1" &&
            item.Folder == "ABC.20181101.CGLOG")
            .Select(item => item.Raw));
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

вы проверяете, содержит ли имя файла нужную вам строку, когда вместо этого вам нужно проверить каждую строку, поскольку ваши папки - то, что вам нужно.

string[] lines = File.ReadAllLines(path1);
// Start at line number 2 because there is a header
for (int i = 1; i < lines.Length; i++)
{
    // 2 ways to do this:
    if (lines[i].Contains("%ABC%"))
    {
        // Copy it where you want
    }

    // or a more structured way:
    if (lines[i].Split('|')[2].Contains("ABC"))
    {
        // Copy it where you want
    }
}
0 голосов
/ 01 ноября 2018

Когда запрашивает ( фильтрует , группирует , суммирует и т. Д.), Попробуйте использовать Linq

using System.Linq;
using System.IO;

...

// Our initial data
var data = File
  .ReadLines(path1)
  .Skip(1) // Skip 1st record (header)
  .Where(line => !string.IsNullOrWhiteSpace(line)) // remove empty lines, if any 
  .Select(line => line.Split('|'))                 // split each line by |
  .Select(items => new {
     Raw  = string.Join("|", items),               // Raw data as it is in the file

     Date = items[0].Trim(),
     ID  = items[1].Trim(),
     Folder = items[2].Trim(),
     Doc = items[3].Trim(),
     FileName = items[4].Trim(), 
     NoOfAct = items[5].Trim(),   
   });

 // Now, it's quite easy to represent the data as we want.
 // And we want to *group by* `Folder` and `ID`: just one GroupBy operation
 var result = data
   .GroupBy(item => new {
      ID = item.ID, 
      Folder = item.Folder})  
   .Select(chunk => 
    $"File {chunk.Key.Folder + "_" + chunk.Key.ID}.txt :\r\n  {string.Join(Environment.NewLine + "  ", chunk.Select(item => item.Raw))}"); 

foreach (var record in result) 
  Console.WriteLine(record);

Вы увидите что-то вроде этого:

File: ABC.20181101.CGLOG_1.txt :
  20181024    |1     |ABC.20181101.CGLOG   |test  |xxxx       |12
File: CDE.20181013.CGLOG_2.txt :
  20181024    |2     |CDE.20181013.CGLOG   |home  |XyyX       |2
... 

Редактировать: В вашей актуальной проблеме давайте создадим filesToWrite запрос вместо result (который мы использовали для демонстрации)

var filesToWrite = data
  .GroupBy(item => new {
     ID = item.ID,
     Folder = item.Folder
    })
  .Select(chunk => new {
    FileName = Path.Combine(
      @"F:\Work\Outcome", //TODO: put the desired directory here
       chunk.Key.Folder + "_" + chunk.Key.ID + ".txt"),
    Lines = chunk.Select(item => item.Raw)
   });

foreach (var file in filesToWrite) {
  // Let's create the directory if it doesn't exist
  Directory.CreateDirectory(Path.GetDirectoryName(file.FileName));
  File.WriteAllLines(file.FileName, file.Lines);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...