Помогите расшифровать имя в PHP и записать обратно в файл .CSV

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

Eric,T.,Nolan
Mary,,Worth
Jim,T.,Lane
E.,Thomas,Powell
William,Reilly,Smith
Johnny,,Depp
Stevie,de,la Soul 

Я могу заставить его распечатать на экране, но мне нужна помощь, чтобы вернуть его в новый файл .csv с тремя полями, разделенными запятыми (например, имя, отчество, фамилия). Не уверен, следует ли мне использовать fwrite или fputcsv. Мне потребовалось много времени, чтобы просто разделить имя, и теперь я застрял на записи его обратно в новый файл csv. Буду признателен за помощь гуру. Спасибо всем!

Вот мой код:

<?php

$file = fopen('nameFile.csv', 'r');
$row = 0;
while (($line = fgetcsv($file)) !== FALSE)
{
list($name[]) = $line;
$row++;
}
$number_of_rows = $row;
fclose($file);

for($i = 0; $i < $number_of_rows; $i++) {
foreach ($name as $NameSplit)
  list($first[], $middle[], $last[]) = explode(' ', $NameSplit, 3);
  if ( !$last[$i] ) {
    $last[$i] = $middle[$i];
    unset($middle[$i]);
  } 
echo $first[$i] . "," . $middle[$i] . "," . $last[$i] . "<br>\n";  
  }

?>

person Thomas    schedule 18.07.2010    source источник
comment
Является ли ввод на самом деле файлом CSV?   -  person George Marian    schedule 18.07.2010
comment
Нет, я так и думал. См. комментарий ниже. Спасибо, Джордж.   -  person Thomas    schedule 18.07.2010


Ответы (2)


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

Сравните мой код со своим. Вы использовали list неправильно, зацикливались без необходимости, увеличивали ненужный счетчик; назвать несколько проблем.

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

$file = fopen('nameFile.csv', 'r');

while (($line = fgets($file)) !== FALSE)
{
    $names_array[] = trim($line); // trim whitespace at the begining and end of each line, in this case the EOL character(s)
}

fclose($file);

$output_file = fopen('/var/tmp/output.csv', 'w');  // this will clobber the file output.csv  use 'a' instead of 'w' if you want to add to an existing file

foreach ($names_array as $name)
{
    $processed_name = explode(' ', $name, 3); // split the name, based on spaces

    // not all full names contain a middle name     
    if (!isset($processed_name[2]))
    {
        $processed_name[2] = $processed_name[1];
        $processed_name[1] = null;
    }

    // output each line into a CSV file
    fputcsv($output_file, $processed_name);
}

fclose($output_file);
person George Marian    schedule 18.07.2010
comment
Да, я полный нуб-хак. Но на самом деле мне это немного нравится как (вздох!) хобби. Это прекрасно работает. Да, мой входной файл - это одно имя в строке. Просто продолжение - был ли я на правильном пути, если у меня есть входной файл csv? Скажем: имя, адрес, возраст. В вашем предыдущем ответе я не мог понять, как поместить следующее в переменную, а затем в csv с помощью fputcsv: $first[$i] . , . $средний[$i] . , . $последний[$i] . ‹br›\n; Но ваш код отлично работает! Еще раз спасибо Джордж - person Thomas; 18.07.2010
comment
@Thomas Да, вы были на правильном пути, и это можно расширить, чтобы справиться с этой ситуацией. Вам просто нужно помнить, что $names_array будет содержать кучу массивов, по одному на каждую строку. Мой предыдущий ответ был быстрым ударом в темноте и имел проблемы. Массив $out будет содержать одну строку на запись, хотя он не будет корректно цитировать значения для CSV-файла. Это может быть просто записано в файл по одной строке за раз. Ваша основная проблема с $first $middle $last заключается в том, что вы неправильно используете массив. Радоваться, веселиться. - person George Marian; 18.07.2010

Последнее выглядит не так. «Стиви де ла Соул», фамилия должна быть «де ла Соул», а отчество должно быть пустым. Кроме того, во многих культурах у людей нет фамилий.

В любом случае, чтобы записать CSV обратно в файл, просто используйте fputcsv() функция. Он указан как «См. также» на странице руководства для fgetcsv().

person bluesmoon    schedule 18.07.2010
comment
Хороший вопрос Блюзмун. Я знаю, что мне, вероятно, придется внести некоторые ручные корректировки с выводом, но я могу с этим смириться. - person Thomas; 18.07.2010