자동으로 검사해야 하는 일반 텍스트 파일과 다른 일반 텍스트 파일에 결과가 기록됩니다. CSV는 데이터 사이에 공통 구분 기호(쉼표, 탭 등)가 있는 일반 텍스트이므로 일반 텍스트와 CSV를 같은 의미로 사용합니다.
데이터 예시
ABD-01A
ABD-01B
ABD-01C
AL-25A
AL-25B
프로세스 1- 데이터의 처음 두 섹션( 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
and 로 나누고data
, - 그런 다음 둘 다 dict/hash/array에 저장하십시오.
keys[data] = key
- 또한
counts[data] = 0
언어가 초기화를 요구하는 경우에도
- 각
- 모든 데이터 파일 읽기:
- 정규식을 사용하여 모든 줄의 시작 부분에서 "TEXT-NUMBER" 데이터를 찾습니다.
counts[data]
1씩 증가 ,- 즉시 출력
keys[data]
, 라인 및counts[data]
.
저는 Perl과 Python으로 예제 스크립트를 작성했습니다. 선택 사항은 다음과 같습니다.
process.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);
}
process.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
답변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{$_}
하고 그렇다면 키 없이 인쇄할 수 있습니다.