2

我有点卡住了,甚至不知道从哪里开始解决这个问题。我有一个 MySQL 查询,它将记录写成这样的字符串:

$values = mysql_query("SELECT Pointer AS Pointer, VNum AS Vnum FROM ".$table."");
$row = 0;
while ($rowr = mysql_fetch_assoc($values)) 
{
  foreach($rowr as $name => $value)
  {
      $csv_output .= $value."|";
  }
      $csv_output .= "\n";
}

这很好用,除了 Vnum 值最终|会像这样附加一个:

10467|66|

我需要在 Vnum 值之后写出10467|66没有分隔符的值。|我该如何处理?

4

9 回答 9

2

你为什么不把数组内爆:

$csv_output .= implode('|', $rowr)."\n";

这应该会给你想要的结果。

请注意,该mysql_*扩展已被弃用,不应用于编写新代码。查看PDO和/或mysqli_*. i代表改进。_

完整”的while 循环最终看起来像这样:

while ($rowr = mysql_fetch_assoc($values))
{
    $csv_output .= implode('|', $rowr)."\n";
}

或者,您可以直接将数据写入 csv(使用自定义分隔符):

$handle = fopen('mycsv.csv','w+');
while ($rowr = mysql_fetch_assoc($values))
{
    fputcsv($handle, $rowr, '|');
}
fclose($handle);

就是这样:您的文件已创建,并包含所有数据。查看文档以获取有关fputcsv 函数的更多信息。

于 2013-01-24T15:53:35.323 回答
2

利用implode()

$values = mysql_query("SELECT Pointer AS Pointer, VNum AS Vnum FROM ".$table."");
$row = 0;
while ($rowr = mysql_fetch_assoc($values)) {
  $csv_output .= implode('|', $rowr) . "\n";
}

另外,停止使用 mysql_* 函数,等等等等 PDO 等等 MySQLi。

于 2013-01-24T15:54:56.943 回答
2

当我做这样的事情时,我会创建一个数组,然后进行连接 - 它只将分隔符放在两者之间,而不是放在最后。

$arr = array();
foreach($rowr as $name => $value)
{
      $arr[] = $value;
}
$csv_output = join('|',$arr);
于 2013-01-24T15:52:45.160 回答
1

干得好:

$csvArray = array();
foreach ($rowr as $name => $value) {
    $csvArray[] = $value;
}
$csv_output = implode('|', $csvArray);
于 2013-01-24T15:51:45.507 回答
1

另一种方法:

$values = mysql_query("SELECT Pointer AS Pointer, VNum AS Vnum FROM ".$table."");
$row = 0;
$csv_output = '';
while ($rowr = mysql_fetch_assoc($values)) 
{
  foreach($rowr as $name => $value)
  {
      $csv_output .= $value."|";
  }
  $csv_output .= substr($csv_output, 0, -1) . "\n";
  // we subtract one char at the end
}
于 2013-01-24T15:54:30.863 回答
1

你只需要看看你要打印的 $value 是否是最后一个,并且只有在不是最后一个时才添加字符。

while ($rowr = mysql_fetch_assoc($values)) 
{
  $last = rowr[count($rowr)-1];
  foreach($rowr as $name => $value)
  {
      $csv_output .= $value;
      if($last != $value){
          echo "|";
      }
  }
      $csv_output .= "\n";
}
于 2013-01-24T15:55:09.230 回答
1

实际上,如果您使用foreach,则循环将一直持续到到达最后一个或该NULL值,因此要处理最后一个字符或 |,您必须添加一个代码以消除最后一个字符。我修改了你的代码现在试试这个:

$values = mysql_query("SELECT Pointer AS Pointer, VNum AS Vnum FROM ".$table."");
$row = 0;
while ($rowr = mysql_fetch_assoc($values)) 
{
  foreach($rowr as $name => $value)
  {
      $csv_output .= $value."|";
  }
      $csv_output = substr_replace($csv_output ,"",-1); //these will remove the excess char

      $csv_output .= "\n";
}
于 2013-01-24T15:58:00.230 回答
1

为什么不直接这样做,MySQL这样您的 PHP 代码就不会有任何连接?
MySQL使用内置函数GROUP_CONCAT时,

示例记录,

columnName
===========
1
2
3
4
5

询问,

SELECT GROUP_CONCAT(columnName SEPARATOR '|') lists
FROM   TableName

结果,

Lists
=========
1|2|3|4|5
于 2013-01-24T15:59:20.927 回答
0

$csv_output = rtrim($csv_output, '|');

于 2013-01-24T15:58:28.103 回答