Разбор и добавление строк в текстовый файл с некоторыми полями из другого файла - PullRequest
1 голос
/ 16 февраля 2010

У меня есть 2 файла, один из которых является основным, а другой - подмножеством этого файла с некоторыми дополнительными данными.Оба файла представлены в виде полей с разделителем ^ A.Моя работа заключается в том, что из основного файла я хочу создать файлы подмножеств.Файлы подмножества уже содержат некоторые данные, которые я могу дублировать, но я хочу, чтобы поля, доступные в основном файле, были также доступны в файле подмножества.

Пример:

subset file format:
1234^A56^A78^A910^A1112^A13^A14^A151617^A18^A192021.000000^A22.000000

master file format:
1242^A2282^A2^A1^A0
1234^A78^A910^A4^A4
1380^A2594^A2^A25^A3
1404^A2447^A6^A44^A9

InВ приведенном выше примере мастер-файл имеет 4 строки, а подмножество - 1 строку.Значения 2-й строки основного файла соответствуют строке в файле подмножества.

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

Кроме того, я хочу сохранить разделители ^ A вфайл подмножества.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2010

Если вы хотите добавить все записи в один и тот же файл подмножества, используйте

#! /usr/bin/perl -l

use warnings;
use strict;

# demo only
my $buf = join "" =>
          map "$_\n" =>
          "1242\cA2282\cA2\cA1\cA0",
          "1234\cA78\cA910\cA4\cA4",
          "1380\cA2594\cA2\cA25\cA3",
          "1404\cA2447\cA6\cA44\cA9";
open my $master, "+<", \$buf or die "$0: open: $!";

open my $subset, ">>", "subset.dat" or die "$0: open: $!";

while (<$master>) {
  chomp;
  my($id,$x,$y) = (split /\cA/)[0..2];

  print $subset join "\cA" =>
    $id, 56, $x, $y, 
    1112, 13, 14, 151617, 18, 192021.000000, 22.000000;
}

close $subset or warn "$0: close: $!";

Как указано в perlop , escape-последовательность \cA создает используемый вами разделитель Ctrl-A (ASCII SOH). Чтобы сохранить демонстрацию автономной, приведенный выше код читает $buf, как если бы это был файл, но, конечно, вы бы открыли мастер-файл в работе.

Выходные данные просматриваются через less, где снова выделено жирным шрифтом ^ A указывает ASCII SOH:

1242<b>^A</b>56<b>^A</b>2282<b>^A</b>2<b>^A</b>1112<b>^A</b>13<b>^A</b>14<b>^A</b>151617<b>^A</b>18<b>^A</b>192021<b>^A</b>22
1234<b>^A</b>56<b>^A</b>78<b>^A</b>910<b>^A</b>1112<b>^A</b>13<b>^A</b>14<b>^A</b>151617<b>^A</b>18<b>^A</b>192021<b>^A</b>22
1380<b>^A</b>56<b>^A</b>2594<b>^A</b>2<b>^A</b>1112<b>^A</b>13<b>^A</b>14<b>^A</b>151617<b>^A</b>18<b>^A</b>192021<b>^A</b>22
1404<b>^A</b>56<b>^A</b>2447<b>^A</b>6<b>^A</b>1112<b>^A</b>13<b>^A</b>14<b>^A</b>151617<b>^A</b>18<b>^A</b>192021<b>^A</b>22
0 голосов
/ 16 февраля 2010
  1. Используйте split для получения полей из мастер-файла.
  2. Используйте rand ($ range) для генерации случайных значений.
  3. Используйте объединение, чтобы соединить ваши поля и случайные значения.

Это отвечает на ваш вопрос?

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