【发布时间】:2016-06-08 17:42:37
【问题描述】:
好的 - 我要发布我的整个剧本,因为我不这样做会受到责备 - 尽管上次我这样做时我因为发布整个剧本而受到责备。我只需要知道我最初询问的那一行是否有效。整个脚本(在其他部门给我他们的数据与我们最初告诉的完全不同之前,它工作得很好)在最后跟进
我正在解析并清理一个 CSV 文件,以便将其加载到 MySQL 表中。它是通过其他人的“批处理 Java 程序”通过表加载的,如果任何字段为空,则批处理文件会因错误而停止。
有人告诉我,只要任何记录中有空字段,就填入一个空格。像这样简单的事情会奏效吗?
if ( ! length $fields[2] ) {
$_ = ' ' for $fields[2];
}
有没有办法同时检查多个字段?或者更好的办法是检查所有字段(这是在拆分记录之后),这是我在将记录写回 CSV 文件之前做的最后一件事。
这是整个脚本。请不要告诉我我在已经工作的脚本中做的事情不是你会做的事情。 -
#!/usr/bin/perl/
use strict;
use warnings;
use Data::Dumper;
use Time::Piece;
my $filename = 'mistints_1505_comma.csv';
#my $filename = 'test.csv';
# Open input file
open my $FH, $filename
or die "Could not read from $filename <$!>, program halting.";
# Open error handling file
open ( my $ERR_FH, '>', "errorFiles1505.csv" ) or die $!;
# Read the header line of the input file and print to screen.
chomp(my $line = <$FH>);
my @fields = split(/,/, $line);
print Dumper(@fields), $/;
my @data;
# Read the lines one by one.
while($line = <$FH>) {
chomp($line);
# Scrub data of characters that cause scripting problems down the line.
$line =~ s/[\'\\]/ /g;
# split the fields of each record
my @fields = split(/,/, $line);
# Check if the storeNbr field is empty. If so, write record to error file.
if (!length $fields[28]) {
chomp (@fields);
my $str = join ',', @fields;
print $ERR_FH "$str\n";
}
else
{
# Concatenate the first three fields and add to the beginning of each record
unshift @fields, join '_', @fields[28..30];
# Format the DATE fields for MySQL
$_ = join '-', (split /\//)[2,0,1] for @fields[10,14,24,26];
# Scrub colons from the data
$line =~ s/:/ /g;
# If Spectro_Model is "UNKNOWN", change
if($fields[22] eq "UNKNOWN"){
$_ = 'UNKNOW' for $fields[22];
}
# If tran_date is blank, insert 0000-00-00
if(!length $fields[10]){
$_ = '0000-00-00' for $fields[10];
}
# If init_tran_date is blank, insert 0000-00-00
if(!length $fields[14]){
$_ = '0000-00-00' for $fields[14];
}
# If update_tran_date is blank, insert 0000-00-00
if(!length $fields[24]){
$_ = '0000-00-00' for $fields[24];
}
# If cancel_date is blank, insert 0000-00-00
if(!length $fields[26]){
$_ = '0000-00-00' for $fields[26];
}
# Format the PROD_NBR field by deleting any leading zeros before decimals.
$fields[12] =~ s/^\s*0\././;
# put the records back
push @data, \@fields;
}
}
close $FH;
close $ERR_FH;
print "Unsorted:\n", Dumper(@data); #, $/;
#Sort the clean files on Primary Key, initTranDate, updateTranDate, and updateTranTime
@data = sort {
$a->[0] cmp $b->[0] ||
$a->[14] cmp $b->[14] ||
$a->[26] cmp $b->[26] ||
$a->[27] cmp $b-> [27]
} @data;
#open my $OFH, '>', '/swpkg/shared/batch_processing/mistints/parsedMistints.csv';
open my $OFH, '>', '/swpkg/shared/batch_processing/mistints/cleaned1505.csv';
print $OFH join(',', @$_), $/ for @data;
close $OFH;
exit;
【问题讨论】:
-
所以
null在您的上下文中是一个没有数据的逗号分隔字段?我想知道如果您将每个逗号更改为由 whilespace 括起来的逗号会发生什么。就像1,$s/,/ , /g会在vi中做的那样。这是否会过多地破坏它,或者它是否可以容忍填充?如果不用担心行首或行尾的null,只需一个空格键即可 -
@BigRedEO:你没有说你想做什么。您是在处理文件中以逗号分隔的原始文本行,还是将其拆分为数组,或者什么?你想要一个文字空间,还是一个被引号包围的空间?
-
@BigRedEO 我建议您仔细考虑从人们那里得到的关于您的问题的 cmets 和反馈,而不是感到沮丧。请感谢所有这些人确实为您付出了他们的时间、精力和专业知识。您可以通过尽力发布好的和清晰的问题来提供帮助(这有时并不容易)。
-
@BigRedEO 让我提出这个建议——也许你在那个 powershell 论坛上的问题更好(如果你对那种材料更满意,很容易发生)?如果你在这里没有得到直接的答案,那只能意味着问题不够清楚(这里重视简洁明了的答案)。我已经查看了您的问题以及您收到的回复。如果可能的话,从你那里得到答案的每个人都会把你的问题一网打尽。但是当你有一点时间重新阅读他们的 cmets 和解决方案时,你会在那里找到所有答案。
-
@BigRedEO: “上次我因为发布整个脚本而受到责备” 问题是,我们需要看到尽可能多的信息,而不必筛选通过一堆垃圾。不要忘记您在此处请求帮助——我们除了感谢之外什么都得不到——如果您不想麻烦发布您的数据或减少您的代码,以便它紧凑但仍然行为不端,那么很难为您提供帮助。 Powershell 问题可能与语法无关,建议重写的人正试图帮助您再次避免同样的问题