从日期时间为索引的文件中提取文本

时间:2010-06-02 04:30:44

标签: c# file directory

我有大约800个文件,每个文件最大55KB-100KB,其中数据采用这种格式

日期,时间,Float1,FLOAT2,FLOAT3,FLOAT4,整数

日期为DD / MM / YYYY格式,时间格式为HH:MM

这里的日期范围从5月1日到1月6日,每天的时间从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 :(得分:0)

现在您已经编辑了问题,以显示分隔符实际上是逗号而不是斜杠(这会与日期格式冲突),这变得容易多了。我在下面的昨晚重新发布了答案。

// 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中操作字符串有一个基本的了解。

答案 1 :(得分:0)

因此,大约100KB的800个文件总计达80 KB。那么为什么不建立像

这样的小班
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()循环。

将所有文件读入List后,您可以做任何LINQ查询。