【问题标题】:Getting data from mysql and creating a csv file issue从 mysql 获取数据并创建 csv 文件问题
【发布时间】:2014-10-14 06:41:28
【问题描述】:

我想提取一些数据并创建一个 csv 文件。这就是我的 attributes 表的样子。你可以在图片中看到它: 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;

【问题讨论】:

  • 我应该提供更多信息吗?
  • 你得到了什么结果?
  • @Malcolm Kindermans 但是现在我需要一个查询和每个属性名称的位置以某种方式放置它们的属性值,我不知道如何获取它
  • 如果您提供的表格结构和示例数据不是图片而是有效的CREATE TABLE .... 和@987654331 @ 语句。

标签: php sql csv


【解决方案1】:
/*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);

【讨论】:

  • 感谢帮助,但我想从属性名称中获取列,请参阅我帖子中的图像。你也可以从我的 cmets 获取数据库
【解决方案2】:

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

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

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

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

【讨论】:

  • 我不想粗鲁,但您能否提供代码,我只是想更好地了解您的建议。提前谢谢。是的,我不在乎速度和并发性
【解决方案3】:
/* 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);

【讨论】:

    【解决方案4】:

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

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

    $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);
    

    【讨论】:

    • 这不会将每个产品的多个属性合并到一行中。
    • 我得到了你的代码结果:警告:explode() 期望参数 2 是字符串,数组在 /home/netlogiq/public_html/MAGENTO/CUSTOM/attin/it4profit/attributes 中给出。第 84 行的 php 警告:fputcsv() 期望参数 2 为数组,在第 84 行的 /home/netlogiq/public_html/MAGENTO/CUSTOM/attin/it4profit/attributes.php 中给出空值
    • 请检查我的 cmets 我发布了一个包含表格结构和内容的链接,谢谢帮助
    • 我不确定您希望如何成为所需的 csv 结果。举个例子
    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2020-04-21
    • 2014-12-25
    • 2019-08-29
    相关资源
    最近更新 更多