从mysql获取数据并创建csv文件问题

时间:2014-10-14 06:41:29

标签: php sql csv

我想提取一些数据并创建一个csv文件。这就是我的属性表的样子。你可以在图片中看到它: HERE

这是我的代码,我尝试过:

$select = mysql_query("select * from attributes");
$final =""; 
$i = 0;
while($row = mysql_fetch_array($select)) {
    $id_produs = $row['id_produs'];
    $n_attr = $row['nume_attr'];
    $val = $row['val_attr'];
    $final .= $id_produs . "%%"  . $val . "%%";
    $csv_array_attributes[$i] = $final;
    $i++;
}

这是我创建CSV文件时的部分:

$file = fopen("attributes.csv", "w+");
foreach ($csv_array_attributes as $line) {
    fputcsv($file, explode('%%', $line), "^", "`");
}
fclose($file);

这将是想要的结果:HERE。因此,nume_attr应该是csv中每列的标题,val_attr应该是每个nume_attr的值(参见图片)。

我尝试了很多方法但是我没有从图像中得到这个结果。我必须提到我的表"属性"有超过74000行。

这是表结构:

CREATE TABLE `attributes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_produs` text NOT NULL,
  `nume_attr` text NOT NULL,
  `val_attr` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=673912 DEFAULT CHARSET=latin1;

4 个答案:

答案 0 :(得分:0)

/*Try following code */     
$select = mysql_query("select * from attributes"); 
        $i = 0;
        $csv_array_attributes[$i]=array('sku','manufacturer_article','manufacturer');
        $i++;
        while($row = mysql_fetch_array($select)) {
            $csv_array_attributes[$i] =array('sku'=>$row['id_produs'],'manufacturer_article'=>$row['nume_attr'],'manufacturer'=>$row['val_attr']);
            $i++;
        }

        $file = fopen("attributes.csv", "w+");
        foreach ($csv_array_attributes as $line) {
            fputcsv($file,$line);
        }
        fclose($file);

答案 1 :(得分:0)

让我们假设速度不是这里的问题,也不是并发性,即你现在只想要结果,无论解决方案有多好,坏或难看; - )

首先通过SELECT DISTINCT nume_attr FROM attributes来查询所有属性名称 将这些名称存储为具有空字符串值的数组的,即您应该有一个类似

的数组
$template = array(
  'Manufacturer Article' => '',
  'Manufacturer' => '',
  ...
)

创建一个存储当前已处理的id_produs的变量(以 false 开头)。 创建一个存储当前“csv”-record的变量(再次以false开头) 查询id_produs和iteratore对结果排序的所有记录。 如果当前记录具有与“当前已处理”不同的id_produs,则写出当前“csv”-array并使用在第一步中创建的模板阵列和当前id_produs重新开始...当前id_produs。对于每条记录,将val_attr值写入csv数组中的键nume_attr。 您将不得不在迭代后检查/写入最后一条记录。

答案 2 :(得分:0)

/* try following code,and reply if it will helpful to you or not */

$select = mysql_query("select * from attributes"); 
$i = 0;
$i++;
while($row = mysql_fetch_array($select)) {

    $csv_array_attributes[$row['id_produs']][$row['nume_attr']] =$row['val_attr'];
    $i++;
}

$arraytempheader=array();
$arraytemp=array();
$arraytempheader[0]="";

$j=1;
foreach ($csv_array_attributes as $Colname=>$alline) {

    if($j!=1)
    {
        foreach($arraytempheader as $key=>$val)
        {
             if($key!=$j && $key!=0)
             $arraytemp[$Colname][$key]="";
        }   
    }

    foreach ($alline as $keyline=>$valline)
    {   
        $arraytempheader[$j]=$keyline;
        $arraytemp[$Colname][$j]=$valline;
        $j++;
    } 
}

$file = fopen("attributes.csv", "w+");
fputcsv($file,$arraytempheader);   

foreach ($arraytemp as $Colname=>$alline) {
    $finalArray=array();
    $finalArray[]=$Colname;
    $finalArray=array_merge($finalArray,$alline);
    fputcsv($file,$finalArray);          
}
fclose($file);

答案 3 :(得分:-1)

尝试以其他方式解决此问题。

在这里选择属性并将它们存储到数组

$select = mysql_query("select * from attributes");
$rezultat=array();
while($row = mysql_fetch_array($select)) {
    $id_produs = $row['id_produs'];
    $n_attr = $row['nume_attr'];
    $val = $row['val_attr'];
    //$final .= $id_produs . "%%"  . $val . "%%";
    $rezultat[] = array('id'=>$id_produs,'attr'=>$val);
}

在这里你把它们写到文件中。

$file = fopen("attributes.csv", "w+");
foreach ($rezultat as $line) {
    fputcsv($file, $line, "^", "`");
}
fclose($file);