-3

次のような数字を含むテキストファイルがあります。

12345678901234567890
123456789012345678901
123456789012345678902
1234567890123456789012
1234567890123456789023
12345678901234567890123
12345678901234567890234

このファイルを 1 行ずつ読み取るスクリプトを作成しました。バイト数だけでなく、行内の文字数を数え、21 文字または 22 文字を含む行のみを選択したいと考えています。

以下のスクリプトを使用すると機能します。23 と言ったのに、なぜ 21 文字を読み取ったのか聞かないでくださいstrlen。バイトしか取得できなかったので、ファイルのエンコードに関係していると思います。

長さが 21 文字または 22 文字の行を選択したら、行を分割する必要があります。21なら2文字列(15文字列と6文字列)、22文字なら16文字列と6文字列に分割する必要があります。

配列にしてみましたが、配列は次のようになります。

Array ( [0] => 123456789012345 [1] => 678901 ) Array ( [0] => 123456789012345 [1] => 678903 )

代わりに次のように表示したい:

123456789012345=678901
123456789012345=678903

配列からエコーする方法はありますか?

$filename = "file.txt";
$fp = fopen($filename, "r") or die("Couldn't open $filename");

while (!feof($fp)){
    $line = fgets($fp);
    $str = strlen($line);
    if($str == 23){
        $str1=str_split($line, 15);
        print_r($str1);
        foreach ($str1 as $value)
        {
           echo $value . "=" ;
        }
    }
    if($str == 24){
        $str1=str_split($line, 16);

        foreach ($str1 as $value)
        {
            echo $value . "=" ;
        }
    }

}
4

1 に答える 1

2

いくつかのポインタ:

$filename = "file.txt";
$lines    = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if ($lines === FALSE) {
   die "Couldn't open $filename";
}

foreach ($lines as $line)
{
    $length = strlen($line);

    if ($length < 21 || $length > 22)  {
        continue;
    }

    $start = 15;
    if ($length === 22) {
        $start = 16;
    }

    echo substr($line, 0, $start), '=', substr($line, $start), "\n";
}

それは と を使用fileしてsubstrいます。PHP では、文字は 1 バイトです。


別の例:

$filename = "file.txt";
$lines    = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if ($lines === FALSE) {
   die "Couldn't open $filename";
}

foreach ($lines as $line)
{
    $start = strlen($line) - 6;

    if ($start === 15 || $start === 16)
    {
        echo substr_replace($line, '=', $start, 0), "\n";
    }

}

この例では、事前に直接計算を使用substr_replaceして実行してい$startます。

于 2012-11-09T16:54:49.943 に答える