0

2 つのファイルを読み込んで、Python (2.7.3) で比較しようとしています。ID
/名前を使用していて「一致」しないため、サイズ/順序が同じではありません。

そして、それらを同時に読み取りたくはありませんが、「file2」を徹底的に「file1」の各行と比較してから、「file1」の別の行を読み取ります。

私がやったことから、それはうまく機能せず、いくつかの問題があります。


たとえば、次のコードを見てください。

if split_cronus[0] == split_data[0]:


プログラムは「if」内のすべてを実行してから終了します。
関数を再度呼び出すと、次のようになります。

print final_line + "\n"

62 回動作し、次のエラーが表示されます。

  Traceback (most recent call last):
   File "C:\Users\Matheus\Desktop\DBWolfmizator\DBWolfmizator\DBWolfmizator.py", line 40,     in <module>
   File "C:\Users\Matheus\Desktop\DBWolfmizator\DBWolfmizator\DBWolfmizator.py", line 28,     in translate_itemdb
translate_itemdb()

プログラムがループするたびに「28行目」エラーが表示されます。

その後:

   File "C:\Users\Matheus\Desktop\DBWolfmizator\DBWolfmizator\DBWolfmizator.py", line 15, in translate_itemdb
for line2 in data:
   ValueError: I/O operation on closed file




つまり、「if」があると、ファイルに 1 行しかない場合のように、1 つの一致しか取得できません。しかし、再帰を使えば、2 番目のファイルが終了する前にさらに数回動作させることができます。

わからない場合:
2 つのファイルを読まなければなりません。
"file1" と "file2"
理論的には、次のようになります。

file1_line1 -> file2_line1
file1_line1 -> file2_line2
file1_line1 -> file2_line3
...
file1_line2 -> file2_line1
file1_line2 -> file2_line1
...

しかし、一致すると、プログラムはループから抜け出します。
それ、どうやったら出来るの?
PHPではうまく機能します。「ポート」のようなものを作ろうとしていました。

Python コード:

cronus = open("item_db.txt", "r+")
data = open("idnum2itemdisplaynametable.txt", 'r')
new_item = open("item_db_new.txt", 'w')
def translate_itemdb():
    try:
        try:
            for line in cronus:
                if line.startswith("//") or len(line) < 3:
                    new_item.write(line)
                    continue

                split_cronus = str.split(line, ",")
                del split_cronus[len(split_cronus) - 1]

                for line2 in data:
                    if line2.startswith("//") or len(line2) < 3:
                        continue

                    split_data = str.split(line2, "#")
                    del split_data[len(split_data) - 1]

                    if split_cronus[0] == split_data[0]:
                        split_cronus[1] = str.replace(split_data[1], " ", "_")
                        split_cronus[2] = str.replace(split_data[1], "_", " ")
                        final_line = ','.join(split_cronus)
                        new_item.write(final_line + "\n")
                        print final_line + "\n"

        finally:
            cronus.close()
            data.close()
            new_item.close()

    except IOError:
        raise

    return

translate_itemdb()



PHP コード:

<?php
set_time_limit(0);

$Cronus = file('item_db.txt');
$Data = file('idnum2itemdisplaynametable.txt');

for( $i = 0; $Cronus[$i]; $i++ ) {
    if( $Cronus[$i][0] == '/' || strlen($Cronus[$i]) < 3 ) {
        echo $Cronus[$i]."<br />";
        continue;
    }

    $ExplodeCronus = explode( ',', $Cronus[$i] );

    for( $j = 0; @$Data[$j]; $j++ ) {
        if( $Data[$j][0] == '/' || strlen($Data[$j]) < 3 )
            continue;

        $ExplodeData = explode( '#', $Data[$j] );

        if( $ExplodeData[0] == $ExplodeCronus[0] ) {
            $ExplodeCronus[1] = str_replace( " ", "_", $ExplodeData[1] );
            $ExplodeCronus[2] = str_replace( "_", " ", $ExplodeData[1] );
            $Linha = implode( ',', $ExplodeCronus );
                echo $Linha."<br />";
        }
        }
    }
?>
4

2 に答える 2