Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 仅解析文本文件中某行的日期_Perl - Fatal编程技术网

Perl 仅解析文本文件中某行的日期

Perl 仅解析文本文件中某行的日期,perl,Perl,我有一个文本文件,在行首有分隔符作为空格 没有初始空格的行应该放在CSV文件的第一列;有两个空格的应该放在CSV的第二列;那些有四个空格的应该放在第三列 这一切都可以按要求正常工作 在以两个空格开头的行中,我希望第二列中只显示日期,丢弃该行的其他数据。其余的都应该保持原样 为了清楚起见,我将行开头的空格表示为# 文本文件: Component1 ##(111) Amar Sen <amar.sen@gmail.com> <No comment> 2013/04/01 ##

我有一个文本文件,在行首有分隔符作为空格

没有初始空格的行应该放在CSV文件的第一列;有两个空格的应该放在CSV的第二列;那些有四个空格的应该放在第三列

这一切都可以按要求正常工作

在以两个空格开头的行中,我希望第二列中只显示日期,丢弃该行的其他数据。其余的都应该保持原样

为了清楚起见,我将行开头的空格表示为
#

文本文件:

Component1
##(111) Amar Sen <amar.sen@gmail.com> <No comment> 2013/04/01
####/Com/src/folder1/folder2/newfile.txt
##(1199) Prashant Singh <psinsgh@gmail.com> <No comment> 2013/04/24
####/Com/src/folder1/folder2/testfile24
####/Com/src/folder1/folder2/testfile25
####/Com/src/folder1/folder2/testfile26
##(1204) Anthony Li <anthon.li@gmail.com> <No comment> 2013/04/25
####/Com/src2
Component2(added)
Component3
这是密码。除上述变更外,其工作正常

use strict;
use warnings;

my $previous_count            = "-1"; #beginning, we will think, that no spaces.
my $current_count             = "0";  #current default value
my $maximum_count             = 3;
my $to_written                = "";
my $delimiter_between_columns = ",";
my $newline_separator         = ";";

my $file = 'C:\\textfile.txt';
open (my $fh, '<:encoding(UTF-8)', $file) or die "Could not open file '$file' $!";

while (my $row = <$fh>) {

  # ok, read.
  chomp($row);

  # print "row is : $row\n";
  if ($row =~ m/^(\s*)/) {

    #print length($1);
    $current_count = length($1) / 2;    #take number of spaces divided by 2
    $row =~ s/^\s+//;

    if ($previous_count >= $current_count || $previous_count == $maximum_count) {

      #output here
      print "$to_written" . $newline_separator . "\n";

      $previous_count = 0;
      $to_written     = "";
    }
    $previous_count = 0 if ($previous_count == -1);
    $to_written .= $delimiter_between_columns x ($current_count - $previous_count) . "$row";

    $previous_count = $current_count;

    #print"\n";
  }
}

print "$to_written" . $newline_separator . "\n";
使用严格;
使用警告;
我的$previous_count=“-1”#首先,我们会认为,没有空间。
我的$current\u count=“0”#当前默认值
我的$maximum_count=3;
我的$to_writed=“”;
我的$delimiter_在_列之间=“,”;
我的$newline_分隔符=“;”;
my$file='C:\\textfile.txt';

打开(我的$fh,你似乎对你的解决方案有些纠结

这个程序似乎可以满足您的需要。我在您的“输出格式”中添加了一些逗号,因为您的示例没有初始空字段的占位符

为此,我保留了散列字符。显然,将它们更改为空格,将
s/^(#*)/
替换为
s/^(\s*)/
,是很简单的

use strict;
use warnings;

my @row;

while (<DATA>) {

  chomp;
  s/^(#*)//;
  my $i = length($1) / 2;

  if ($i == 1 and m<(\d{4}/\d{2}/\d{2})>) {
    $row[$i] = $1;
  }
  else {
    $row[$i] = $_;
  }

  if ($i == 2) {
    print join(',', @row), ";\n";
    @row = ('') x 3;
  }
}


__DATA__
Component1
##(111) Amar Sen <amar.sen@gmail.com> <No comment> 2013/04/01
####/Com/src/folder1/folder2/newfile.txt
##(1199) Prashant Singh <psinsgh@gmail.com> <No comment> 2013/04/24
####/Com/src/folder1/folder2/testfile24
####/Com/src/folder1/folder2/testfile25
####/Com/src/folder1/folder2/testfile26
##(1204) Anthony Li <anthon.li@gmail.com> <No comment> 2013/04/25
####/Com/src2

更新

将第1列和第2列中的值级联到未提供值的后续行中更有意义。如果从我的程序中删除行
@row=('')x 3
,它将使用此输出执行此操作

Component1,2013/04/01,/Com/src/folder1/folder2/newfile.txt;
Component1,2013/04/24,/Com/src/folder1/folder2/testfile24;
Component1,2013/04/24,/Com/src/folder1/folder2/testfile25;
Component1,2013/04/24,/Com/src/folder1/folder2/testfile26;
Component1,2013/04/25,/Com/src2;

你似乎对你的解决方案有些纠结

这个程序似乎可以满足您的需要。我在您的“输出格式”中添加了一些逗号,因为您的示例没有初始空字段的占位符

为此,我保留了散列字符。显然,将它们更改为空格,将
s/^(#*)/
替换为
s/^(\s*)/
,是很简单的

use strict;
use warnings;

my @row;

while (<DATA>) {

  chomp;
  s/^(#*)//;
  my $i = length($1) / 2;

  if ($i == 1 and m<(\d{4}/\d{2}/\d{2})>) {
    $row[$i] = $1;
  }
  else {
    $row[$i] = $_;
  }

  if ($i == 2) {
    print join(',', @row), ";\n";
    @row = ('') x 3;
  }
}


__DATA__
Component1
##(111) Amar Sen <amar.sen@gmail.com> <No comment> 2013/04/01
####/Com/src/folder1/folder2/newfile.txt
##(1199) Prashant Singh <psinsgh@gmail.com> <No comment> 2013/04/24
####/Com/src/folder1/folder2/testfile24
####/Com/src/folder1/folder2/testfile25
####/Com/src/folder1/folder2/testfile26
##(1204) Anthony Li <anthon.li@gmail.com> <No comment> 2013/04/25
####/Com/src2

更新

将第1列和第2列中的值级联到未提供值的后续行中更有意义。如果从我的程序中删除行
@row=('')x 3
,它将使用此输出执行此操作

Component1,2013/04/01,/Com/src/folder1/folder2/newfile.txt;
Component1,2013/04/24,/Com/src/folder1/folder2/testfile24;
Component1,2013/04/24,/Com/src/folder1/folder2/testfile25;
Component1,2013/04/24,/Com/src/folder1/folder2/testfile26;
Component1,2013/04/25,/Com/src2;

您发布的“输出格式”与您描述的您想要的格式不匹配,因为CSV字段由逗号分隔,任何不带逗号的行都表示所有内容都在第一列中。“输出格式”您发布的内容与您描述的内容不匹配,因为CSV字段由逗号分隔,任何不带逗号的行都意味着所有内容都在第一列。感谢您的回复。它按照我需要的方式工作,只是在一个失败的地方。事实上,我错了,我应该对它进行更多采样。如果我有Component2和C组件3(开头没有空格),代码也应该输出Component2和Component3,不管它是否有数据,但代码只输出那些有数据的行。我已经更新了我问题中的文本文件和输出格式。请看一看。谢谢你的回答。它按照我需要的方式工作,除了在一个地方失败。事实上,我的错误,我应该有采样更多。如果我有Component2和Component3(开头没有空格),代码也应该输出Component2和Component3,不管它是否有数据,但代码只输出有数据的行。我在问题中更新了文本文件和输出格式。请看一看。