【问题标题】:php fgets, fwrite and newlinephp fgets、fwrite 和换行符
【发布时间】:2015-04-21 20:33:31
【问题描述】:

使用 php fgets 函数,我正在从一个文件中读取特定格式的文件“A”,并使用 fwrite 以特定格式写入另一个文件,文件“B”。 但是,无论我放置什么新行或换行符,一些字符都会错位。 以下是我希望在新文件文件 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

【问题讨论】:

  • 您的文件是逗号分隔的,但您使用explode(" ", $line),它使用空格作为列分隔符。
  • 看起来只是一个错字,explode(" ", $line) 应该是explode(",", $line)

标签: php newline fwrite fgets


【解决方案1】:

逗号放错是因为fgets() 返回的字符串末尾包含换行符。所以$fesult[6] 在末尾有一个换行符,所以$fiv 被放到下一行。解决方案是在爆炸之前修剪输入,然后在输出中写一个换行符。

额外的行是因为您在阅读该行之前正在测试 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);
}

【讨论】:

  • 我用 " " 展开,因为原始文件用 " " 分隔。
  • 以下是原始文件: IMSI: 645030142200060 Ser_Nb: 8926003010422000608F * ***************************** ****************************************************** * * 输出变量 ********************************************** ************************************ * 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 跨度>
  • 请用输入文件更新问题。使用 SO 编辑器中的{} 工具将其标记为代码,这样会按字面意思显示。
  • fwrite 突然出现“警告:fwrite() 期望参数 1 是资源”错误,以前没有。
  • 将代码更改为您建议的代码后,我收到警告:fwrite() 期望参数 1 是资源
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 2012-11-06
  • 2017-02-11
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
相关资源
最近更新 更多