2016-12-14 7 views
-3

Я довольно хорошо знаком с функцией Strtok() в PHP, и у меня не было проблем с тем, чтобы функция работала правильно для строк в прошлом. Тем не менее, я в настоящее время должен прочитать текстовый файл .csv (который я сделал успешно), где каждая строка состоит из 6 полей, таких как: фамилия, имя, адрес, город, район, почтовый индекс \ r \ n < - возврат каретки и возврат линии в концеPHP - strtok(), ассоциативное отношение массива

Мне нужно использовать Strok(), чтобы разделить их на разделители и обозначить слова как поля (например, последний, первый, адрес и т. д.). Я планирую использовать ассоциативный массив, используя фамилию в качестве первичного ключа, чтобы я мог подключать данные в HTML-таблицу, которая создана и работает. Моя проблема прямо сейчас заключается в том, чтобы расщепить файл правильно, так как он имеет около 200 строк из этих 6 полей и правильно сохраняет строки как поля для массива, поэтому структура данных - это то место, где у меня возникают некоторые проблемы. Вот то, что я до сих пор:

$inputFile = fopen("input.csv","r"); 
    $delimiters = ","; 
    $token = strtok($inputFile, $delimiters); 
    $n=1; 

    while ($token){ 
     echo "Token $n: $token <br>"; 
     $token = strtok($delimiters); 
     $n++; 
    } 

Очевидно, что таблица создана под ним, но так как я не сделал структуру данных совсем еще, у меня нет поля для него. Я думаю, что мой токен цикл может быть неправильным для этой проблемы, но я вытащил некоторые из более раннего примера в моей книге и упражнение, которое я сделал там, где работал мой токен, но структура файла была другой. Спасибо за любое направление или помощь в этом.

+0

Какая строка примера CSV и где вы получаете эти «слова» для использования в качестве ассоциативных ключей массива? – AbraCadaver

+0

В основном каждая строка содержит эти 6 значений и затем возвращается к следующему. Вот два примера: –

+0

SELBY, AARON, 1519 Santiago de los Caballeros Loop, Mwene-Ditu, East Kasai, 22025 GOOCH, ADAM, 230 Urawa Drive, Adoni, Andhra Pradesh, 2738 –

ответ

0

есть функции CSV в PHP, как fgetcsv, так что на самом деле это неправильный подход к изобретать колесо.

Обратите внимание, что в вашем коде вы фактически не читаете содержимое файла, так как вы получаете только указатель файла.

Если вам действительно нужно сделать это с strtok, и ваш CSV является простой, в том смысле, что он не цитировали строки, которые могли бы вложенной символы-разделители, вы можете использовать:

  • file_get_contents() для чтения содержимого файла в одной строке. Конечно, file() облегчило бы вам, так как оно уже разделило линии. Но я предполагаю, что если функции CSV недопустимы для вас, тогда это не будет.

  • strtok для получения полей, но в конце цикла, а не в начале, поскольку начальный вызов с двойными аргументами уже получает первое значение перед циклом.

Код:

$input = file_get_contents("input.csv"); 
$delimiters = ",\n\r"; 

$token = strtok($input, $delimiters); 
$result = []; 
$row = []; 
while ($token){ 
    echo "Token $token <br>"; 
    $row[] = $token; 
    if (count($row) == 6) { // write record 
     $result[] = $row; 
     $row = []; 
    } 
    $token = str_replace('\r', '', strtok($delimiters)); 
} 

print_r($result); 

Обратите внимание, что это не создает ассоциативный массив. Если вам нужно, а затем использовать этот код:

$columns = ['last', 'first', 'address1', 'address2', 'address3', 'zip']; 

, а затем в цикле, замените $row[] = $token на:

 $row[$columns[count($row)]] = $token; 

Вы можете видеть, что версия работать на eval.in. Вывод данных, который вы указали в комментариях:

Array (
    [0] => Array (
     [last] => SELBY 
     [first] => AARON 
     [address1] => 1519 Santiago de los Caballeros Loop 
     [address2] => Mwene-Ditu 
     [address3] => East Kasai 
     [zip] => 22025 
    ) 
    [1] => Array (
     [last] => GOOCH 
     [first] => ADAM 
     [address1] => 230 Urawa Drive 
     [address2] => Adoni 
     [address3] => Andhra Pradesh 
     [zip] => 2738 
    ) 
) 

Опять же, это нецелесообразно. Вы должны использовать fgetcsv. Это также лучше работает со строками, которые могут иметь запятые, двойные кавычки или даже новые строки в них.

+0

Спасибо, это определенно ставит меня на правильный путь. Я полностью понимаю проблему с этим, так как я нашел несколько простых способов сделать это. По какой-то причине мой профессор решил использовать a.csv-файл, чтобы показать функцию токенов, но это потеряно для меня. Один вопрос: это отображается в моей таблице с пустыми почтовыми полями, но они показывают токены, когда я печатаю результаты. Может ли это иметь отношение к части count ($ row)? –

+0

Я не вижу такой проблемы. Я добавил ссылку на код в своем ответе, где вы можете проверить содержимое массива * $ result * правильно и содержать почтовый индекс. Вероятно, у вас есть другая проблема в коде, который генерирует таблицу. Вы всегда можете задать новый вопрос. – trincot

0

Ну, я собирался пропустить этот вопрос, потому что fgetcsv(), но мне было скучно:

$lines = file($inputFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 
$delimiters = ","; 

foreach($lines as $line) { 
    $values = array(strtok($line, $delimiters)); 
    while($token = strtok($delimiters)){ 
     $values[] = $token; 
    } 
    $result[] = $values; 
} 
  • Прочитайте файл строки в массив
  • Loop, чтобы получить каждую строку и поставить первый маркер линии в массив значений
  • Loop линии и получить все маркеры и добавить к значениям массива
  • Добавить значения массива в результирующий массив

Я добавил array_combine(), потому что вы что-то сказали об ассоциативном массиве. Вы можете использовать что-то вроде этого, если необходимо:

$result[] = array_combine(array('last name', 
            'first name', 
            'address', 
            'city', 
            'district', 
            'postal code'), $values); 

Если вы хотите фамилию быть ключом для каждой строки результата, который не является целесообразным, так как ключи уникальны, и я не думаю, что вы можете гарантировать последними имена являются уникальными:

$result[$values[0]] = $values; 
    //or to remove it from the array but use as the key 
    $result[array_unshift($values)] = $values; 
+0

Это очень много работы для чего-то, что «все еще» неправильно с «Spaced Out», 2, «This» «Thing» «" »является действительным CSV в зависимости от вашего определения« действительный »и« CSV ». – tadman

+0

Нет, дерьмо! Не увижу, как я «использую» его. ; -0 – AbraCadaver

+0

Да, это довольно хорошо для синтаксического разбора значений, разделенных запятыми, но не файлов CSV. – tadman