自動的に検査され、別のプレーン テキスト ファイルに結果が書き込まれるプレーン テキスト ファイルがあります。CSV はデータ間の一般的な区切り文字 (カンマ、タブなど) を持つプレーン テキストであるため、プレーン テキストと CSV を同じ意味で使用することに注意してください。
データ例
ABD-01A
ABD-01B
ABD-01C
AL-25A
AL-25B
プロセス 1- データの最初の 2 つのセクション ( text
- number
) を認識して繰り返し、出力 CSV でカウントします。
ABD-01,1
ABD-01,2
ABD-01,3
AL-25,1
AL-25,2
プロセス2- 上記で収集されたデータの最初の部分には、別のファイルで割り当てられた主キーのようなものが存在します。新しく生成されたファイルに記載されている主キーも取得したいと思います。
#primary key file
1,ABD-01
2,ABD-02
3,AL-02
20,AL-25
#newly generated file
1,ABD-01,1
1,ABD-01,2
1,ABD-01,3
20,AL-25,1
20,AL-25,2
つまり、私が彼女に尋ねているのは、Windows または Linux ベースのオペレーティング システムで、この作業に役立つソフトウェアがあるかどうかということです。Bash はより単純な処理には役立ちますが、これほど多くの処理はできないと思います。アドバイスをお願いします。
答え1
- 好みの言語を選択します。Perl はテキストに適しています。Python、PHP、Ruby も、少し遅くなりますが問題ありません。
- まずキーファイルを読み取ります:
key,data
各行を と にkey
分割しdata
、- 次に、両方を辞書/ハッシュ/配列に保存します。
keys[data] = key
counts[data] = 0
言語が初期化を要求する場合も
- すべてのデータファイルを読み取ります:
- 正規表現を使用して各行の先頭にある「TEXT-NUMBER」データを検索します。
counts[data]
1ずつ増加し、- そして、すぐに
keys[data]
、行、および を出力しますcounts[data]
。
私は Perl と Python の両方でサンプル スクリプトを書いたので、どちらかをお選びください。
プロセス.pl
#!/usr/bin/env perl
use strict;
sub usage {
print "Usage: $0 <key_file> <data_file...>\n";
return 2;
}
my $keys_file = shift(@ARGV) // exit(usage);
my @data_files = @ARGV;
my %keys; # $data => $primarykey
my %counts; # $data => $count
# Read keys
open(my $fh, "<", $keys_file) or die "$!";
while (my $line = <$fh>) {
chomp($line);
my ($key, $datum) = split(/,/, $line, 2);
if (!defined $datum) {
warn "$keys_file: line $. not in KEY,DATA format: '$line'\n";
next;
}
$keys{$datum} = $key;
$counts{$datum} = 0;
}
close($fh);
# Read and output data
my $ex = qr/^(\w+-\d+)\w*/;
for my $data_file (@data_files) {
open(my $fh, "<", $data_file) or die "$!";
while (my $line = <$fh>) {
chomp($line);
if ($line =~ /$ex/) {
my $datum = $1;
if (!defined $keys{$datum}) {
warn "no primary key found for data '$datum'\n";
next;
}
# Increment count, then print processed line immediately
$counts{$datum}++;
print "$keys{$datum},$&,$counts{$datum}\n";
}
else {
warn "$data_file: line $. does not begin with TEXT-NUMBER: '$_'\n";
}
}
close($fh);
}
プロセス.py
#!/usr/bin/env python
from __future__ import print_function
import sys
import re
def usage():
print("Usage: %s <key_file> <data_file...>" % sys.argv[0])
return 2
try:
keys_file = sys.argv[1]
data_files = sys.argv[2:]
except IndexError:
sys.exit(usage())
except ValueError:
sys.exit(usage())
keys = {}
counts = {}
# Read keys
for line in open(keys_file, "r"):
try:
key, datum = line.strip().split(",", 1)
except ValueError:
print("%s: line not in KEY,DATA format: %r" \
% (keys_file, line.strip()), file=sys.stderr)
continue
keys[datum] = key
counts[datum] = 0
# Read and output data
ex = re.compile(r'^(\w+-\d+)\w*')
for data_file in data_files:
for line in open(data_file, "r"):
line = line.strip()
m = re.match(ex, line)
if m:
datum = m.group(1)
if datum not in keys:
print("no primary key found for data %r" % datum,
file=sys.stderr)
continue
# Increment count, then print processed line immediately
counts[datum] += 1
print("%s,%s,%d" % (keys[datum], m.group(0), counts[datum]))
else:
print("%s: line does not begin with TEXT-NUMBER: %r" \
% (data_file, line.strip()), file=sys.stderr)
答え2
私はそうするだろうパイソン使用して正規表現python
シェルに入力するだけで、インストールされているかどうかを確認できます。
それ以外の場合はパールperl
シェルに入力して、インストールされているかどうかを確認してください。正規表現の組み込みサポート。
答え3
プロセス1
perl count.pl datafile …
count.plは次のようになります
#!perl
use strict;
use warnings;
my %headwordcount;
while (<>) {
if (/^([A-Z]+-\d+)/) { $headwordcount{$1}++; }
# else { warn "Bad data: $_"; } # uncomment line for data warnings
}
END {
foreach (sort keys %headwordcount) {
print "$_,$headwordcount{$_}\n";
}
}
未テスト、購入者自己責任。
プロセス2
次のようなものを追加
my %key;
BEGIN {
my $keyfilename = 'primary.key';
open my $fh, '<', $keyfilename or die "Can't read '$keyfilename' - $!\n";
while (<$fh>) {
chomp;
my ($key,$headword) = split(/,/, $_, 2);
$key{$headword} = $key;
}
close $fh;
}
印刷行をEND {}
次のように変更します。
print "$key{$_},$_,$headwordcount{$_}\n";
再度、未テストです。
データ ファイルにキー ファイルにない見出し語が含まれている場合は警告が生成されます。$key{$_}
未定義かどうかをチェックし、未定義の場合はキーなしで印刷できます。