Лучший метод: парсинг CSV-файла и передача обратно во внешний интерфейс с помощью AJAX - PullRequest
2 голосов
/ 08 октября 2009

У меня есть файл CSV, который загружается на мой сервер, где PHP-скрипт анализирует и возвращает вывод в JavaScript через AJAX.

Файл CSV состоит из двух строк. Первая строка содержит имена столбцов, а вторая строка содержит данные. Я пытаюсь написать сценарий, который будет анализировать его в форме, которая будет использоваться Javascript для создания текстовых полей и меток, заполненных этими данными. Текущий метод, который у меня есть, это:

if ( $_FILES['parameter_file']['tmp_name'] ) {

    $paramfile = fopen($_FILES['parameter_file']['tmp_name'], 'r');
    $header = fgets($paramfile);
    $temp = explode(',', str_replace('"', '', rtrim(ltrim($header))));

    $userdata = fgets($paramfile);
    $temp2 = explode(',', str_replace('"', '', rtrim(ltrim($userdata))));

    for ($k = 0; $k <= sizeof($temp) - 1; $k++) {
        $userparam[strtolower($temp[$k])] = $temp2[$k];
    }

    fclose($paramfile);
}

Я вижу множество возможностей для общего улучшения, не стесняйтесь указывать на них. Но главный вопрос в том, будет ли json_encode всем, что мне нужно. Что-нибудь более эффективное? Лучшая идея?

Спасибо всем

Ответы [ 2 ]

4 голосов
/ 08 октября 2009

Как Лукаш Лалинский написал в своем комментарии к ответ CSL fgetcsv() ваш друг (кстати str_getcsv() недоступно до PHP 5.3).

Код должен быть простым как (обработка ошибок оставлена ​​на OP):

$headers   = null;
$rowNum    = 0;
$tableData = array();
$handle    = fopen($_FILES['parameter_file']['tmp_name'], 'r');
while (($data = fgetcsv($handle)) !== false) {
    if ($rowNum == 0) {
        // parsing the CSV header
        $headers = array();
        foreach ($data as $d) {
            $headers[] = $d;
        }
    } else {
        // parsing the data rows
        $rowData = array();
        foreach ($data as $d) {
            $rowData[] = $d;
        }
        $tableData[] = array_combine($headers, $rowData)
    }
    $rowNum++;
}
fclose($handle);

Учитывая CSV-файл:

id,name,value
1,first,value1
2,second,value2
3,third,value3

это даст вам массив headers с

array(
    0 => 'id',
    1 => 'name',
    2 => 'value'
)

и массив $tableData с

array(
    0 => array(
        'id'    => '1',
        'name'  => 'first',
        'value' => 'value1'
    ),
    1 => array(
        'id'    => '2',
        'name'  => 'second',
        'value' => 'value2'
    ),
    2 => array(
        'id'    => '3',
        'name'  => 'third',
        'value' => 'value3'
    )
)

Настройте код по необходимости ...

2 голосов
/ 08 октября 2009

Я бы лучше использовал str_getcsv () / fgetcsv () и затем json_encode () . Между ними вы всегда можете перетасовать данные, чтобы выводимый JSON выглядел так, как вы хотите.

В общем случае лучше использовать библиотечные функции, если они доступны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...