2

我编写了下面的代码,将 .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";  
  }

?>
4

2 回答 2

1

冒着用勺子喂你的风险,我决定全部重做。您的代码显示了新程序员的特征(无意冒犯)。

将我的代码与您自己的代码进行比较。您使用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);
于 2010-07-18T02:46:20.687 回答
0

最后一张看起来不太对。“Stevie de la Soul”,姓氏应为“de la Soul”,中间名应为空。此外,在许多文化中,人们没有姓氏。

无论如何,要将 CSV 写回文件,只需使用fputcsv()函数。它在fgetcsv()的手册页上被列为“另见” 。

于 2010-07-18T02:41:43.667 回答