Извлечение текста из файла, где date -time является индексом - PullRequest
0 голосов
/ 02 июня 2010

У меня есть около 800 файлов размером не более 55–100 КБ каждый, в которых данные находятся в этом формате

Дата, время, Float1, float2, float3, Float4, Integer

Дата указывается в формате ДД / ММ / ГГГГ, а время - в формате ЧЧ: ММ

Здесь дата колеблется от 1 мая до 1 июня, и каждый день время меняется с 09:00 до 15:30.

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

Я пытаюсь обойти, сформировать для выполнения операции поиска и извлечения. Я не знаю, как это сделать, хотел бы иметь представление.

Я написал код ниже:

static void Main(string[] args)
    {
        string destpath = Directory.GetCurrentDirectory();
        destpath += "\\DIR";
        DirectoryInfo Dest = Directory.CreateDirectory(destpath);
        DirectoryInfo Source = new DirectoryInfo(Directory.GetCurrentDirectory() + "\\IEOD");
        FileInfo[] fiArr = Source.GetFiles("*.csv");
        Console.WriteLine("Search Date:");
        string srchdate = Console.ReadLine();
        String FileNewLine;
        String FileNewdt;
        FileInfo r;
        foreach (FileInfo f in fiArr)
        {
            r = new FileInfo(destpath + "\\" + f.Name);
            r.Create();
            StreamWriter Sw = r.AppendText();                
            StreamReader Sr = new StreamReader(f.FullName);

            while (Sr.Peek() >= 0)
            {
                FileNewLine = Sr.ReadLine();
                FileNewdt = FileNewLine.Substring(0,10);
                if (String.Compare(FileNewdt, srchdate, true) == 0)
                {
                    //write it to a file;
                    Console.WriteLine(FileNewLine);

                }
            }

        }
        Console.ReadKey();


    }

На данный момент он должен записываться в консоль. Запись с помощью StreamWriter будет выполнена позже, но я столкнулся с ошибкой во время выполнения. В нем говорится: «C: \ Documents and Settings \ Soham Das \ Desktop \ Test \ DIR \ ABAN.csv ', поскольку он используется другим процессом». Здесь ABAN - это недавно созданный файл, по коду. Проблема стоит на StreamWriter Sw = r.AppendText()

Помощь приветствуется. Спасибо Soham

Ответы [ 2 ]

0 голосов
/ 02 июня 2010

Итак, 800 файлов размером около 100 КБ суммируют до 80 КБ. Так почему бы не создать небольшой класс вроде

public class Entry
{
    public DateTime Date {get; set;}
    public float Float1 {get; set;}
    public int Integer1 {get; set;}

    public Entry(string values)
    {
        //ToDo: Parse single line into properties
        //      e.g. use String.Split, RegEx, etc.
    }
}

Также вам следует позаботиться о реализации GetHashCode() и Equals() (в книге есть хорошее объяснение Essential C # ). И вы должны добавить интерфейс IComparable к тому классу, который просто делает что-то вроде

public int CompareTo(Entry rhs)
{
    return this.Date.CompareTo(rhs.Date);
}

Если вы получили это, вы можете легко сделать следующее:

var allEntries = new SortedList<Entry>();

string currentLine = null;

using (var streamReader = new StreamReader("C:\\MyFile.txt"))
    while ((currentLine = streamReader.ReadLine()) != null)
    {
        try
        {
            var entry = new Entry(currentLine);
            allEntries.Add(entry);
        }
        catch (Exception ex)
        {
            //Do whatever you like
            //maybe just
            continue;
            //or
            throw;
        }
    }

Так что не хватает, чтобы прочитать во всех файлах (вместо одного). Но это может быть сделано другим циклом на Directory.GetFiles(), который, возможно, сам зацикливается на Directory.GetDirectories().

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

0 голосов
/ 02 июня 2010

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

// This would come from Stream.ReadLine() or something
string line = "02/06/2010,10:05,1.0,2.0,3.0,4.0,5";

string[] parts = line.Split(',');
DateTime date = DateTime.ParseExact(parts[0], "dd/MM/yyyy", null);
TimeSpan time = TimeSpan.Parse(parts[1]);
date = date.Add(time); // adds the time to the date
float float1 = Single.Parse(parts[2]);
float float2 = Single.Parse(parts[3]);
float float3 = Single.Parse(parts[4]);
float float4 = Single.Parse(parts[5]);
int integer = Int32.Parse(parts[6]);

Console.WriteLine("Date: {0:d}", date);
Console.WriteLine("Time: {0:t}", date);
Console.WriteLine("Float1: {0}", float1);
Console.WriteLine("Float2: {0}", float2);
Console.WriteLine("Float3: {0}", float3);
Console.WriteLine("Float4: {0}", float4);
Console.WriteLine("Integer: {0}", integer);

Очевидно, что вы можете сделать его более устойчивым, добавив обработку ошибок, используя TryParse и т. Д. Но это должно дать вам общее представление о том, как манипулировать строками в .NET.

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