2016-04-14 6 views
1

このファイルには、さまざまなファイルの異なるパスと、行の変更数でどのファイルタイプが変更されたのかが含まれています。このようなものPerlでテキストファイルを解析してJSONで情報を保存

abc123: 
    Files Changed:        lines: new deleted unchanged 
    some/path/to/file.c        15  0   4234 
    some/other/file.h         1  0   223 
    some/other/path/to/file2       3  1    3 
    Files Created:        lines: new deleted unchanged 
    some/path/to/file.c        3  1    3   
    Files Changed:        lines: new deleted unchanged 
    some/other/path/to/file       2  2   234 

私はこれを解析する簡単な方法を見つける必要があります。私は本当に行の変更(新規、削除、変更なし)は気にしません。私が望むのは、JSONを持つことです。このような何か:

{ 
    "abc123":{ 
     "Files Changed:": [ 
      "some/path/to/file.c", 
      "some/other/file.h", 
      "some/other/path/to/file", 
      "some/other/path/to/file2" 
     ], 
     "Files Created:":[ 
      "some/path/to/file.c" 
     ] 
    } 
} 

難しい部分は、私は、ファイルがあなたを与えるもので動作することができます何かをしたいテキストファイルを解析しようとすることです。私が確かに知っていることは、 '/'を持っているものがファイル文字列ですが、「ファイルが変更されました」または「ファイルが作成されました」ということを伝える方法がわかりません。また、ファイルには、「ファイルが削除されました」、「ファイルリンク」、対応するファイルパスなどがあります。これを達成するためのどのような助けにも感謝します。

+0

行頭の空白が一貫している場合は、これは非常に簡単です。 1行ずつ読むだけで、最後に見たものを覚えておく必要があります。このgitは出力されていますか? – simbabque

答えて

3

行頭の空白が一貫している限り、これは非常に簡単です。あなたは行ごとに読んで、どのレベルで見たものかを覚えておく必要があります。

次のコードでは、レベルごとに2つのインデントがあると仮定しています。これは、バージョン管理の概要のいくつかの並べ替えのように見えるので、私は$commit ABC123インデントの0レベル、

  • と1レベル下にリストされているファイルに行われている$operation

    • を呼んでいます。
    • 第2レベルにはファイル名が含まれています。
    use strict; 
    use warnings; 
    use JSON 'to_json'; 
    
    my $commit; # abc123 
    my $operation; # Files Changed, Files Created 
    my $data; # this is the target 
    
    while (my $line = <DATA>) { 
        if ($line =~ /^(\S+):/) { 
         # line contains a commit 
         $commit = $1; 
         next; 
        } 
        if ($line =~ /^\s\s([^:]+):/) { 
         # line contains an operation 
         $operation = $1; 
         next; 
        } 
        if ($line =~ /^\s\s\s\s(\S+)/) { 
         # this is a filename 
         push @{ $data->{$commit}->{$operation} }, $1; 
        } 
    } 
    
    print to_json $data; 
    
    __DATA__ 
    abc123: 
        Files Changed:        lines: new deleted unchanged 
        some/path/to/file.c        15  0   4234 
        some/other/file.h         1  0   223 
        some/other/path/to/file2       3  1    3 
        Files Created:        lines: new deleted unchanged 
        some/path/to/file.c        3  1    3 
        Files Changed:        lines: new deleted unchanged 
        some/other/path/to/file       2  2   234 
    

    これは、次の出力を生成します。

    {"abc123":{"Files Changed":["some/path/to/file.c","some/other/file.h","some/other/path/to/file2","some/other/path/to/file"],"Files Created":["some/path/to/file.c"]}} 
    
  • +0

    あなたは人生の救世主です!スペースについては考えなかった。出来た!ありがとう! –

    関連する問題