0

我正在尝试从多个数据文件中读取和提取特定信息,其中每个文件的文件名格式都相同,我的文件格式是 XXXXXX_XXXXXX_PCPDTB_ODT.datafile,其中 X 是一个随机数字。

它在前 6 位数字中表示年、月、日,在后 6 个 X 中表示小时、分钟和秒,因此 131005_091429_PCPDTB_ODT.datafile 将是 2013 年、第 10 个月、第 5 天等等,_PCPDTB_ODT.datafile 始终存在。

我能够成功地从文件中收集我想要的数据(在某个关键字之后提取所有信息,在这种情况下,'#Footer' 是我的关键字),但我不确定如何处理这个问题具有几个变化整数的文件?

这是我的尝试(虽然这很糟糕,因为我对编码的经验很少),但似乎只是输入 4 位数字而已。仅允许访问 XXXX_PCPDTB_ODT.datafile 或 1304_PCPDTB_ODT.datafile 之类的文件。

static void Main(string[] args)
    {
        var path = @"C:\Users\#####\Desktop\";
        var ext = "_PCPDTB_ODT.datafile";
        var range = Enumerable.Range(0,9);
        var filePaths = 
                from i1 in range
                from i2 in range
                from i3 in range
                from i4 in range
                let file = path + i1 + i2 + i3 + i4 + ext
                where File.Exists(file)
                select File.ReadLines(file)
                    .SkipWhile(line => !line.Contains("#Footer"))
                    .Skip(1);
        try
        {
            Console.WriteLine(String.Join(Environment.NewLine,filePaths.SelectMany(f => f)));
        }
        catch (Exception e)
        {
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
            Console.Read();
        }
    }

我尝试使用“_”添加更多 i 值、i5、i6、i7 等,以将前 6 位数字与后 6 位数字隔开,但是当使用超过 i4 的较大 i 值时,它似乎没有做任何事情。

任何想法都会有很大帮助,请记住我的编码很可能是垃圾,因为我目前的知识很少,谢谢。

4

4 回答 4

3

如果您尝试处理目录中的所有文件,请使用Directory.EnumerateFiles

例如:

foreach (var filename in Directory.EnumerateFiles(@"c:\mydata\", "*PCPDTB_ODT.data")
{
    var lines = File.ReadLines(filename)
               .SkipWhile(line => !line.Contains("#Footer"))
               .Skip(1);
    // add the rest of your code . . .
}
于 2013-11-12T16:54:34.600 回答
3

与其尝试遍历每个可能的有效文件名,不如只查看那里有哪些文件。这是一个使用示例Directory.GetFiles

var filePaths = Directory.GetFiles(path, "*" + ext)
                  .Select(file => File.ReadLines(file)
                    .SkipWhile(line => !line.Contains("#Footer"))
                    .Skip(1));

如果您还需要日期/时间,也可以使用DateTime.ParseExact.

于 2013-11-12T16:55:03.037 回答
1

当使用超过 i4 的较大 i 值时,它似乎没有做任何事情

可能是因为它必须遍历 1,000,000,000,000 个不同的文件名?

为什么不只获取与模式匹配的文件列表?

    var path = @"C:\Users\#####\Desktop\";
    var pattern = "??????_??????_PCPDTB_ODT.datafile";

     var filePaths = Directory.GetFiles(path, pattern)
                              .Select(file => File.ReadLines(file)
                              .SkipWhile(line => !line.Contains("#Footer"))
                              .Skip(1));
于 2013-11-12T16:56:55.957 回答
0

尝试这个

using System;

public class Test
{
public static void Main()
{
    string str = "131005_091429_PCPDTB_ODT.datafile ";
    int[] date = new int[3];
    int[] time = new int[3];

    string[] arr = str.Split('_');
    for(int i = 0;i<6;i=i+2)
    {
        date[i/2]=Convert.ToInt32(arr[0].Substring(i,2));
    }

    for(int i = 0;i<6;i=i+2)
    {
        time[i/2]=Convert.ToInt32(arr[1].Substring(i,2));
    }
}
}
于 2013-11-12T17:11:45.077 回答