php fgets、fwrite 和换行符

php fgets, fwrite and newline

使用 php fgets 函数,我正在读取一个文件,文件 "A" 是一种特定的格式,我正在写入另一个文件,文件 "B" 是一种特定的格式使用 fwrite 格式化。 然而,无论我放什么新行或换行符,一些字符总是错位。 下面是我希望在新文件中看到的格式,文件 B:

ICCID,IMSI,KI,ESN,PIN1,PUK1,PIN2,PUK2,IMSI2,KI2,ACC_NBR,NAI_USERNAME,NAI_PASS
8926003010422000616F,,,645030142200061,2064,16002217,4029,34594354,,,,,
8926003010422000624F,,,645030142200062,8678,91445678,5351,06417774,,,,,
8926003010422000632F,,,645030142200063,0356,51052167,6976,27210792,,,,,
8926003010422000640F,,,645030142200064,5504,38104570,4917,61385706,,,,,
8926003010422000657F,,,645030142200065,7158,23625228,2726,13487033,,,,,
8926003010422000665F,,,645030142200066,3922,52488665,6014,33705660,,,,,

但下面正是我得到的:

ICCID,IMSI,KI,ESN,PIN1,PUK1,PIN2,PUK2,IMSI2,KI2,ACC_NBR,NAI_USERNAME,NAI_PASS
8926003010422000608F,,,645030142200060,3741,26564507,7283,13507659
,,,,,8926003010422000616F,,,645030142200061,2064,16002217,4029,34594354
,,,,,8926003010422000624F,,,645030142200062,8678,91445678,5351,06417774
,,,,,8926003010422000632F,,,645030142200063,0356,51052167,6976,27210792
,,,,,8926003010422000640F,,,645030142200064,5504,38104570,4917,61385706
,,,,,8926003010422000657F,,,645030142200065,7158,23625228,2726,13487033
,,,,,,,,,,,,,,,,,

你会注意到字符 ,,,,, 被放在一行的开头,而不是我希望它们出现的结尾。还要注意最后一行变为 ,,,,,,,,,,,,,,,,,。根本不需要。

下面是读写的代码。需要有人帮我解决这个问题。

    $headStockin= "ICCID,IMSI,KI,ESN,PIN1,PUK1,PIN2,PUK2,IMSI2,KI2,ACC_NBR,NAI_USERNAME,NAI_PASSWORD"."\r\n";
    $file = fopen($inputFile, "r");  // reading input file
    $myStockinfile = fopen($inputFile."_StockIn.txt", "wb") or die("Unable to create/open a file!"); 
    fwrite($myStockinfile, $headStockin);
    $thr=",,,";
    $one=",";
    $fiv=",,,,,";

    $lineNo = 0;
    $startLine = 21;

    while(!feof($file)){
        $lineNo++;
        $line = fgets($file);

        if ($lineNo >= $startLine) {
            $result = explode(" ", $line);
            $in= $result[2].$thr.$result[1].$one.$result[3].$one.$result[5].$one.$result[4].$one.$result[6].$fiv;
            echo $in;   //to see output on html
            fwrite($myStockinfile,$in);
        }

    }
    fclose($file);
    fclose($myStockinfile);

}



INPUT FILE BELOW

    *
********************************************************************************
* HEADER DESCRIPTION
********************************************************************************
*
Quantity:   5000
*
********************************************************************************
* INPUT VARIABLES
********************************************************************************
*
var_in_list:
IMSI:   645030142200060
Ser_Nb: 8926003010422000608F
*
********************************************************************************
* OUTPUT VARIABLES
********************************************************************************
*
var_out:MSISDN/IMSI/ICCID/PIN1/PIN2/PUK1/PUK2
+260950605404 645030142200060 8926003010422000608F 3741 7283 26564507 13507659
+260950605411 645030142200061 8926003010422000616F 2064 4029 16002217 34594354
+260950605412 645030142200062 8926003010422000624F 8678 5351 91445678 06417774
+260950605416 645030142200063 8926003010422000632F 0356 6976 51052167 27210792
+260950605418 645030142200064 8926003010422000640F 5504 4917 38104570 61385706
+260950605421 645030142200065 8926003010422000657F 7158 2726 23625228 13487033

错位的逗号是因为 fgets() returns 字符串末尾包含换行符。所以 $fesult[6] 最后有一个换行符,所以 $fiv 被放到下一行。解决方法是trim爆破前的输入,然后在你的输出中写一个换行符

额外的行是因为您在阅读该行之前要测试 EOF。 feof() 直到 阅读文件末尾后才被检测到。

因此将循环更改为:

while ($line = fgets($file)) {
    $lineNo++;
    if ($lineNo < 21) { // Skip first 20 lines
        continue;
    }
    $line = rtrim($line);
    $result = explode(" ", $line);
    $in= $result[2].$thr.$result[1].$one.$result[3].$one.$result[5].$one.$result[4].$one.$result[6].$fiv.PHP_EOL;
    echo $in;
    fwrite($myStockinfile, $in);
}