0

質問 1: fgetc ファイル ポインターを現在の場所から次の行に手動で移動するにはどうすればよいですか?

指定された数の区切り記号がカウントされるまで、データを 1 文字ずつ読み込んでいます。区切り文字のカウントが特定の数に達すると、新しい行 (レコード区切り文字) まで行の残りをコピーする必要があります。次に、次のレコードから再び文字ごとにコピーを開始する必要があります。

質問 2:ファイル ポインタを手動で次の行に移動することは正しい考えですか? 私は(「\ n」で)爆発するだけですが、「\ n」は常にレコード区切り文字であるとは限らないため、最初にパイプ区切り文字を数える必要があります。

これが私のコードです(レコードの最後の区切り文字「|」に到達するまで、すべてのデータを正しいレコードに入れます。次に、行の残りを次のレコードに入れます。正しく作成する方法がわからないためです)指定した数の | がカウントされた後、'\n' を探します):

$file=fopen("source_data.txt","r") or exit ("File Open Error");
$record_incrementor = 0;
$pipe_counter = 0;

while (!feof($file))
    {
        $char_buffer = fgetc($file);
        $str_buffer[] = $char_buffer;

            if($char_buffer == '|')
            {
                $pipe_counter++;
            }
            if($pipe_counter == 46) //Maybe Change to 46
            {   
                $database[$record_incrementor] = $str_buffer;
                $record_incrementor++;
                $str_buffer = NULL;
                $pipe_counter = 0;
            }


    }

サンプルデータ:

1378|2009-12-13 11:51:45.783000000|"Pro" |"B13F28"||""|1||""|""|""|||False|||""|""|""|""||""||||||2010-12-15 11:51:51.330000000|108||||||""||||||False|""|""|False|""|||False
1379|2009-12-13 12:23:23.327000000|"TLUG"|"TUG"||""|1||""|""|""|||False|||""|""|""|""||""||||||1943-04-19 00:00:00|||||||""||||||False|""|""|False|""|||False
4

3 に答える 3

1

変更された質問への回答:

ファイル ポインタから行末までを読み取るには、単純にファイル読み取り関数を使用できますfgets()。現在のファイル ポインター位置から行末に到達するまでのすべてを返します (また、行末文字も返します)。関数呼び出し後、ファイル読み込みポインタは次の行の先頭に移動しています。

于 2011-03-15T16:38:08.470 に答える
1

次のように行末まで読むことができます。

while (!feof($file) && fgetc($file) !== '\n');

これを行う正しい方法であるかどうかについてfgetcは...あなたのフォーマットは他のものを使用することを困難にします。\nフィールド内に改行がある可能性があるため、 で分割することはできません。|また、レコードの最後にパイプがないため、 で分割することもできません。

私が考えることができる他の唯一のオプションは、使用することpreg_match_allです:

$buffer = file_get_contents('test.txt');
preg_match_all('/((?:[^|]*\|){45}[^\n]*\n)/', $buffer, $matches);
foreach ($matches[0] as $row) {
  $fields = explode('|', $row);
}
于 2011-03-15T16:34:08.660 に答える
1

ファイル処理関数を介してこれを行うのは、正規表現を介して非常に簡単に行うことができる場合、少し不器用だと思います。withfile_get_contents()のような正規表現を使用してファイル全体を文字列に読み込むだけで、すべての行を見つけることができます (これを区切り文字として使用し、フィールド数の制限として 48 を設定できます。/^(([^|]*\|){47}([^\r\n]*))/mpreg_match_all()explode()|

これは実際の関数の例です。この関数は、ファイル名、フィールド区切り文字、および行ごとのフィールド数を引数として受け取ります。この関数は、最初のインデックスがデータ行番号で、2 番目がフィールド番号である 2 次元配列を返します。

function loadPipeData ($file, $delim = '|', $fieldCount = 48)
{
    $contents = file_get_contents($file);
    $d = preg_quote($delim, '/');
    preg_match_all("/^(([^$d]*$d){" . ($fieldCount - 1) . '}([^\r\n]*))/m', $contents, $match);
    $return = array();

    foreach ($match[0] as $line)
    {
        $return[] = explode($delim, $line, $fieldCount);
    }

    return $return;
}

var_dump(loadPipeData('source_data.txt'));

(注:これは元の問題の解決策です)

于 2011-03-15T16:29:48.023 に答える