-2

さて、私はこの問題に数時間を費やしましたが、何が起こっているのかわかりません. 特に私は 24 時間以上起きていて、締め切りは 5 時間以内なので、この問題について新鮮な視点が必要だと思います。

CSV から取得したデータを使用しようとすると、オフセット (0 ~ 907) ごとに未定義のオフセット通知が表示されます。(おそらく、データを正常に取得できていないことを意味しますが、疲れ果てており、助けていただければ幸いです)

私が間違っていることを誰かが知っていますか?

$lines = array();
$lines2 = "";

$one = array();
$two = array();
$three = array();
$four = array();
$five = array();
$six = array();

$header = "";

$footer = "";

$countLines = 0;

/*
* Open the file and store its data into an array
*/
$fp = fopen('db.csv','r') or die("can't open file");

while($lines = fgetcsv($fp)) {

        for ($k = 0, $m = count($lines) - 1; $k < $m; $k++) {

            $one[$k] = $lines[0];
            $two[$k] = $lines[1];
            $three[$k] = $lines[2];
            $four[$k] = $lines[3];
            $five[$k] = $lines[4];
            $six[$k] = $lines[5];
    }
    $countLines++;

}




fclose($fp) or die("can't close file");


/*
* Set up file header
*/
$header = "Header"
    ;


/*
* Set up file footer
*/
$footer = "Footer";

/*
* Prepare data for export
*/
for ($i = 0, $j = $countLines - 1; $i < $j; $i++) {


            $lines2 .= $one[$i] ." ". 
            $two[$i] ." ". 
            str_pad($three[$i], 3) ." ". 
            str_pad($four[$i], 30) ." ". 
            str_pad($five[$i], 30) ." ". 
            str_pad($six[$i], 30) ."\r\n";

}

/*
* Store data in file
*/
$fp = fopen('db2.csv', 'w') or die("can't open file");

fwrite($fp, $header);

fwrite($fp, $lines2);

fwrite($fp, $footer);

fclose($fp) or die("can't close file");

CSV ファイルは標準のコンマ区切りファイルなので、そのデータをここに投稿する理由はありません。

4

2 に答える 2

0

私は同じものを手に入れ、あなたと同じ解決策を探します...実際、それは本当に単純で悪魔的なものです。読み取りの最後に1つの値をfgetcsv()持つ配列を追加します。NULLしたがって、$lines[1]最後に追加された配列には値が1つしかないため、エラーが発生します。

次のように$行の列数を数えるだけです:

/*
* Open the file and store its data into an array
*/
$fp = fopen('db.csv','r') or die("can't open file");

while($lines = fgetcsv($fp)) {

    if ( count($lines) == 6 )
    {

        for ($k = 0, $m = count($lines) - 1; $k < $m; $k++) {

           $one[$k] = $lines[0];
           $two[$k] = $lines[1];
           $three[$k] = $lines[2];
           $four[$k] = $lines[3];
           $five[$k] = $lines[4];
           $six[$k] = $lines[5];
        }
    }
    $countLines++;

}
于 2012-05-28T22:31:29.307 に答える
0

ステートメント

while($lines = fgetcsv($fp)) {

fgetcsvは、行の要素を含む配列の形式で 1 ​​行を返します。

したがって、次は間違っており、CSV の 1 行を反復処理しているため、削除する必要があります。

   for ($k = 0, $m = count($lines) - 1; $k < $m; $k++) {

したがって、改訂後、読み取りループは(私が思うに)次のようになります。

$fp = fopen('db.csv','r') or die("can't open file");
$k=0;
while($lines = fgetcsv($fp)) {
            $one[$k] = $lines[0];
            $two[$k] = $lines[1];
            $three[$k] = $lines[2];
            $four[$k] = $lines[3];
            $five[$k] = $lines[4];
            $six[$k] = $lines[5];
    $k++;
    $countLines++;
}

この使用後、配列を表示するためのデバッグ用の print_r($one) など。

それを出力するには、db2.csvに出力していますが、(分離するために)コンマを使用していないため、達成したいことについて推測に大きく依存しています。ただし、次のようなものを試してください

/*
 * Store data in file
 */
$fp = fopen('db2.csv', 'w') or die("can't open file");
fwrite($fp, $header);

/*
 * Data for export
 */
for ($i = 0, $j = $countLines - 1; $i < $j; $i++) {
    fprintf($fp, "%s %s %-3s %-30s %-30s %-30s\r\n", /* possibly add commas here? */
            $one[$i], $two[$i], $three[$i],$four[$i], $five[$i], $six[$i]);

}
于 2011-08-26T07:25:59.213 に答える