用perl解析纬度和经度

用perl解析纬度和经度,perl,parsing,Perl,Parsing,我这里有一个文件,看起来像这样: 4900N 5350W 4830N 4900W 5000N 4900W 6000N 5830W 6000N 4000W 3000N 5000W 我正在尝试使用perl脚本,在该脚本中,我可以将坐标输入csv文件,如下所示: 4900N 5350W 4830N 4900W 5000N 4900W 6000N 5830W 6000N 4000W 3000N 5000W 我有一段代码,在其中我试图这样做,但没有得到预期的结果: 你能看看代码,看看应该怎么做

我这里有一个文件,看起来像这样:

4900N 5350W 
4830N 4900W
5000N 4900W
6000N 5830W
6000N 4000W
3000N 5000W


我正在尝试使用perl脚本,在该脚本中,我可以将坐标输入csv文件,如下所示:

4900N 5350W 
4830N 4900W
5000N 4900W
6000N 5830W
6000N 4000W
3000N 5000W
我有一段代码,在其中我试图这样做,但没有得到预期的结果:

你能看看代码,看看应该怎么做才能把文本文件中的所有坐标转换成上面的格式吗

代码如下:

`rm -f coords.TXT`;
open FPOUT, ">$outfile" or die "\nERROR: Could create/write $outfile\n\n";
for ( $ii = 0; $ii < 7; $ii++ ) {
    #if ($ii==5)
    #{
    #   print STDOUT "LINE 1\n";
    #}
    #if ($ii==6)
    #{
    #   print STDOUT "LINE 2\n";
    #}
    @words = split " ", "$inline[$ii]";
    for ( $jj = 0; $jj < (@words); $jj++ ) {
        @char = split "", "$words[$jj]";
        $n = 0;
        for ( $kk = 0; $kk < (@char); $kk++ ) {
            $n = $n + 1;
        }
        if ( $n =~ 5 or $n =~ 6 ) {
            if ( $char[0] =~ /[a-zA-z]/ ) {

            } else {
                if ( $char[4] =~ "W" or $char[4] =~ "E" or $char[4] =~ "N" or $char[4] =~ "S" ) {
                    if ( $n =~ 6 ) {
                        if ( $char[5] =~ "." ) {
                            $words[$jj] =~ s/\.//;
                        }
                    }
                    if ( $char[4] =~ "W" or $char[4] =~ "E" ) {
                        $lon = $words[$jj];
                        print STDOUT "longitude is $lon\n";
                    } elsif ( $char[4] =~ "N" or $char[4] =~ "S" ) {
                        $lat = $words[$jj];
                        print STDOUT "Latitude is $lat\n";

                    }
                    print FPOUT "$lat $lon\n";
                }

            }
        }

    }
}

close FPOUT;
`rm-f coords.TXT`;
打开FPOUT“>$outfile”或死“\n错误:可能创建/写入$outfile\n\n”;
对于($ii=0;$ii<7;$ii++){
#如果($ii==5)
#{
#打印标准输出“第1行\n”;
#}
#如果($ii==6)
#{
#打印标准输出“第2行\n”;
#}
@文字=拆分“,$inline[$ii]”;
对于($jj=0;$jj<(@words);$jj++){
@字符=拆分“”“$words[$jj]”;
$n=0;
对于($kk=0;$kk<(@char);$kk++){
$n=$n+1;
}
如果($n=~5或$n=~6){
如果($char[0]=~/[a-zA-z]/){
}否则{
如果($char[4]=“W”或$char[4]=“E”或$char[4]=“N”或$char[4]=“S”){
如果($n=~6){
如果($char[5]=~”){
$words[$jj]=~s/\./;
}
}
如果($char[4]=“W”或$char[4]=“E”){
$lon=$words[$jj];
打印标准输出“经度为$lon\n”;
}elsif($char[4]=~“N”或$char[4]=~“S”){
$lat=$words[$jj];
打印标准输出“纬度为$lat\n”;
}
打印输出“$lat$lon\n”;
}
}
}
}
}
收尾;
使用正则表达式解析数据 要提取所需的模式,只需一个正则表达式:

while (<DATA>) {
    print "$_\n" for /\b\d+[NS]\s+\d+[WE]\b/g;
}

__DATA__
FICN10 CWIS 211446
ICEBERG BULLETIN FOR THE EAST COAST WATERS ISSUED BY ENVIRONMENT
CANADA AT 11:00 A.M. EDT TUESDAY 21 OCTOBER 2014 FOR TODAY.
THE NEXT SCHEDULED BULLETIN WILL BE ISSUED AT 11:00 A.M. WEDNESDAY.
ICEBERG LIMIT AT 0000 UTC 22 OCT ESTIMATED FROM NEWFOUNDLAND NEAR
4900N 5350W TO 4830N 4900W TO 5000N 4900W TO 6000N 5830W TO
6000N 4000W TO 3000N 5000W.
文件处理 有关如何使用Perl处理文件的几个示例,我建议查看:

在您的特定情况下,以下内容可能有用:

#!/usr/bin/env perl
use strict;
use warnings;
use autodie;

my $file = 'bulletin.txt';

open my $fh, "<", $file;

while (<$fh>) {
    print "$_\n" for /\b\d+[NS]\s+\d+[WE]\b/g;
}
#/usr/bin/env perl
严格使用;
使用警告;
使用自动模具;
my$file='bulletin.txt';

打开我的$fh,“为了提供一种可能的替代方法,加拿大环境部似乎为海洋天气警报提供了一个平台,包括冰警报。如果它提供相同的数据,那么解析为XML可能比解析为纯文本更容易。数据位于一个名为bulletin.txt的文件中。我想让程序做的是阅读bulletin.txt,然后给我输出:4900N 5350W 4830N 4900W 5000N 4900W 6000N 5830W 6000N 4000W 3000N 5000W如何使用正则表达式?请再看一遍-只是想帮我一下。@MarkSetchell我总是欣赏SO的协作性/维基性。谢谢你的帮助。
#!/usr/bin/env perl
use strict;
use warnings;
use autodie;

my $file = 'bulletin.txt';

open my $fh, "<", $file;

while (<$fh>) {
    print "$_\n" for /\b\d+[NS]\s+\d+[WE]\b/g;
}