从某些模式下的文本文件列表中获取数据

时间:2015-05-13 10:17:58

标签: regex r matlab

我想它并不那么困难,但我真的被卡住了。 我有一些文件,用9个数字的字符串命名,如:

-Dlog4j.configurationFile=file:///var/lib/tomcat7/log4j.xml

每个文件都标识一个测量站,并包含一个包含两列003485295.lst 005847283.lst 092348235.lst ... date的表,由空格字符分隔。例如,value是:

003485295.lst

有些日期在所有文件(电台)中很常见,但有些日期不是。

我正在寻找

我选择了一个特定的日期,比如date value //header row here! 2014-01-03-07:00-00 2.2 2014-01-04-07:00-00 3.1 2014-01-05-07:00-00 28.6 2014-01-06-07:00-00 2.5 2014-01-14-07:00-00 5.6 ... 。我想:

  • 创建一个空结果文件,例如2014-01-06;
  • 遍历我的所有2014-01-06.txt个文件;
  • 搜索电台*********.lst当天是否进行了一些衡量********;
  • 在结果文件中添加一行,遵循模式stationId-value,例如MM.M(也可以是******** MM.MM.M)。

所以期望的输出MMM.M就像:

2014-01-06.txt

应排除当天没有任何价值的电台。我在Windows上并且手中有003485295 2.5 //as we read in 003485295.lst 001022903 6.4 001022905 6.6 001022907 10.3 001026202 30.6 ... R,但也可以使用其他工具。

2 个答案:

答案 0 :(得分:0)

使用R

的方法

我会通过以下方式解决这个问题:

  1. 使用read.csv函数将所有文件上传到R中的单个数据表(您的文件基本上是以空格分隔的CSV,因此这应该相对简单)

  2. 按日期对值进行排序

  3. 用因子替换日期

  4. 按照this等日期因素拆分data.table。

  5. 通过data.tables执行for,并使用write.csv函数

  6. 将每个单独转储为CSV

    使用Excel的方法

    1. 使用DIR函数(循环文件)通过VBA上传所有文件并阅读每个文件 - 链接here。使用空格上的Split函数来标记字符串。将所有数据转储到单个工作表

    2. 按日期列

    3. 手动对数据进行排序
    4. 编写一个简短的VBA宏,使用this和一段代码将数据转储到单独的文件中:

      将文件日期视为字符串 Do Until currDate.Value =""   if fileDate<>然后currDate     '创建新文件日期     fileDate = currDate   万一   '将数据转储到文件中   写#fileNo,Cells(currDate.Row,2) 环

    5. 在整个练习中,基本上记住文件是space delimited CSVs,这将有助于获得正确的读写文件的方法。

答案 1 :(得分:0)

这是一个Matlab函数,可以实现这一目标。 (它假设你至少有Matlab R2014b,因为它使用了matlab日期时间。如果没有,你可以使用datenum)。

function result = getDateData(dateToLookup)
    % Get a list of all *.lst files
    d = dir('*.lst');

    result = [];
    for i=1:length(d)
        % Read in the data file using readtable.  Delimiter is space, but need
        % to skip the first line because it doesn't follow this pattern
        t = readtable(d(i).name, 'FileType', 'text', 'Delimiter', ' ', ...
            'HeaderLines', 1, 'ReadVariableNames', false);
        t.Properties.VariableNames = {'Date', 'Data'};

        % Convert the first column to datetime
        t.Date = datetime(t.Date, 'Format', 'yyyy-MM-dd-HH:mm-ss');

        % Looks like you want to lookup by date (and not consider
        % hours/minutes/seconds, so shift these to start of day)
        t.Date = dateshift(t.Date, 'start', 'day');

        % Add in the filename to the table (minus the .lst)
        t.FileName = repmat({strrep(d(i).name, '.lst', '')}, height(t), 1);

        % Append table to the result
        result = [result; t]; %#ok<AGROW>
    end

    % This is the date you're asking for
    dt = datetime(dateToLookup);

    % Find all of the matches
    matches = result(result.Date == dt, :);

    % Create a new table as the result and write it out
    result = table(matches.FileName, matches.Data, ...
        'VariableNames', {'FileName', 'Data'});
    writetable(result, 'data.txt', 'Delimiter', ' ');
end