Неопределенное смещение PHP с помощью fgetcsv - PullRequest
0 голосов
/ 26 августа 2011

Хорошо, я потратил несколько часов на эту проблему, и я не уверен, что происходит. Я думаю, что мне просто нужен свежий взгляд на эту проблему, тем более, что я проснулся более 24 часов, а крайний срок - пять часов.

Я получаю уведомление о неопределенном смещении для каждого отдельного смещения (от 0 до 907), когда пытаюсь использовать данные, извлеченные из CSV. (Это, вероятно, означает, что я не извлекаю данные успешно, но я измотан и был бы признателен за помощь)

Кто-нибудь знает, что я делаю не так?

$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-файл - это стандартный файл с разделителями-запятыми, поэтому я не вижу смысла размещать эти данные здесь.

Ответы [ 2 ]

0 голосов
/ 29 мая 2012

Я получаю то же самое и ищу решение, как и вы ... На самом деле оно действительно простое и дьявольское: fgetcsv() добавить массив с одним значением NULL в конце чтения.Следовательно, $lines[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++;

}
0 голосов
/ 26 августа 2011

Оператор

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

fgetcsv вернет одну строку в виде массива, содержащего элементы в строке;

Следовательно, следующее неверно и должно быть удалено, поскольку вы перебираете одну строку в CSV

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

Итак, после ревизии цикл чтения должен (я думаю) быть похожимthis:

$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]);

}
...