Программирование на C # Как извлечь столбцы / строки из текстового файла? - PullRequest
4 голосов
/ 18 ноября 2010

У меня есть консольная программа на C #, основные функции которой позволяют пользователю извлекать строки / столбцы из текстового файла журнала.

Пример в текстовом файле, который пользователь желает отобразить для группы всех связанных строк, начиная с определенной даты и т. Д. "Вт. 03 августа 2004 г. 22:58:34" до "ср. 04 августа 2004 г. 00:56:48" .Поэтому после обработки программа затем выведет все данные, найденные в текстовых файлах журнала, между двумя датами.

Может кто-нибудь посоветует некоторые коды, которые я мог бы использовать для grep или создать фильтр для извлечения необходимоготекст / данные из файла?Спасибо!

Программные файлы C #:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;

namespace Testing
{
class Analysis
{
    static void Main()
    {
        // Read the file lines into a string array.
        string[] lines = System.IO.File.ReadAllLines(@"C:\Test\ntfs.txt");

        System.Console.WriteLine("Analyzing ntfs.txt:");

        foreach (string line in lines)
        {
            Console.WriteLine("\t" + line);

            //  ***Trying to filter/grep out dates, file size, etc****
            if (lines = "Sun Nov 19 2000")
            {
                Console.WriteLine("Print entire line");
            }
        }

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
}

Пример текстового файла журнала:

Wed Jul 21 2004 16:58:48   499712 m... r/rrwxrwxrwx 0        0        8360-128-3 
C:/Program Files/AccessData/Common Files/AccessData LicenseManager/LicenseManager.exe

Tue Aug 03 2004 22:58:34    23040 m... r/rrwxrwxrwx 0        0        8522-128-3 
C:/System Volume Information/_restore{88D7369F-4F7E-44D4-8CD1-
F7FF1F6AC067}/RP4/A0002101.sys

23040 m... r/rrwxrwxrwx 0        0        9132-128-3 
C:/WINDOWS/system32/ReinstallBackups/0003/DriverFiles/i386/mouclass.sys

23040 m... r/rrwxrwxrwx 0        0        9135-128-4 C:/System Volume 
Information/_restore{88D7369F-4F7E-44D4-8CD1-F7FF1F6AC067}/RP4/A0003123.sys

23040 m... r/rrwxrwxrwx 0        0        9136-128-3 
C:/WINDOWS/system32/drivers/mouclass.sys

Tue Aug 03 2004 23:01:16   196864 m... r/rrwxrwxrwx 0        0        4706-128-3 
C:/WINDOWS/system32/drivers/rdpdr.sys

Tue Aug 03 2004 23:08:18    24960 m... r/rrwxrwxrwx 0        0        8690-128-3 
C:/WINDOWS/system32/drivers/hidparse.sys

Ответы [ 3 ]

4 голосов
/ 18 ноября 2010

Вы можете сделать это, используя Regex, чтобы выбрать совпадающие строки более богатым способом, чем позволяет string.Contains.

Не знаю, почему вы заново изобретаете findstr.exe.

Для больших файлов может показаться, что File.ReadLines (только .Net 4) работает лучше - это читаетте же строки, но позволяют обрабатывать их в foreach и других IEnumerable сценариях без одновременной загрузки всего файла в оперативную память.

3 голосов
/ 18 ноября 2010

Ну, как быстрое решение для конкретного примера:

if (line.StartsWith("Sun Nov 19 2000"))
{
    Console.WriteLine(line);
}

Вы можете использовать Contains, чтобы найти подстроку в строке.

Обратите внимание, что загрузка всего файла в массив не будет хорошо масштабироваться для очень больших журналов. Мы можем рассмотреть, как исправить это, если это проблема для вас, но давайте поторопимся:)

1 голос
/ 28 мая 2012

Вот метод стиля grep, который я использую при тестировании:

    public static List<string> FileGrep(string filePath, string searchText)
    {
        var matches = new List<string>();

        using (var f = File.OpenRead(filePath))
        {
            var s = new StreamReader(f);

            while (!s.EndOfStream)
            {
                var line = s.ReadLine();

                if (line != null && line.Contains(searchText)) matches.Add(line);   
            }

            f.Close();
        }

        return matches;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...