1

行頭にスペースとして区切り文字を含むテキスト ファイルがあります。

最初のスペースがない行は、CSV ファイルの最初の列に配置する必要があります。スペースが 2 つあるものは、CSV の 2 列目に入れる必要があります。スペースが 4 つあるものは 3 列目に入れます。

これはすべて、必要に応じて正常に機能しています。

2 つのスペースで始まる行では、2 番目の列に日付のみを入れて、行の他のデータを破棄する必要があります。残りはすべてそのままにしておく必要があります。

#明確にするために、行頭にスペースを示しました。

テキストファイル:

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

出力フォーマット:

Component1,2013/04/01,/Com/src/folder1/folder2/newfile.txt
           2013/04/24,/Com/src/folder1/folder2/testfile24
                  /Com/src/folder1/folder2/testfile25
                      /Com/src/folder1/folder2/testfile26
           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";
4

1 に答える 1