1

我有一个格式如下的 csv 文件:

a;a1;1;0;1
b;b1;1;0;0

并使用下面的 php 脚本,我可以将其转换为:

a;a1;1;
a;a1;0;
a;a1;1;
b;b1;1;
b;b1;0;
b;b1;0;

使用这个:

$data = array();
foreach($lines as $value) {
    $value = explode(";", $value);

    $first = array_splice($value, 0, 2);

    foreach($value as $x){
        $row = $first;
        $row[] = $x;
        $data[] = implode(';', $row);
    }
}

其中输出是一个数组:

array(6) {
  [0]=>
  string(6) "a;a1;1"
  [1]=>
  string(6) "a;a1;0"
  [2]=>
  string(6) "a;a1;1"
  [3]=>
  string(6) "b;b1;1"
  [4]=>
  string(6) "b;b1;0"
  [5]=>
  string(6) "b;b1;0"
}

现在我正在尝试将此数组插入到我已设置的 mysql 表中,但我遇到了麻烦......

$file = "_ss.csv";
$lines = file($file);
$count = count($lines);
$data = array();
$i = 0;
foreach($lines as $value){
    $value = explode(";", $value);
    $first = array_splice($value, 0, 2); 

    foreach($value as $x){

        $row = $first;
        $row[] = $x;
        $data[] = implode(',', $row);
        $dump = implode(',', $data);
        $query="INSERT INTO csv_test2 VALUES ('$dump')";
        $init=mysql_query($query);
$i++;
echo $dump;

    }
}

echo "<pre>";
print_r($dump);
echo "</pre>";

任何想法如何使它工作?

4

6 回答 6

1

好的,这就是我想出的解决方案,正是我所需要的。

foreach(explode($lineseparator,$csvcontent) as $value){
      $lines++;
      $value = trim($value," \t");
      $value = str_replace("\r","",$value);
      $value = str_replace("'","\'",$value); 
      $linearray = explode($fieldseparator,$value);
      $linemysql = implode("','",$linearray); // sitas rdy siuntimui i db
      $first = array_splice($linearray, 0, 2); 
    foreach($linearray as $x){
            $row = $first;
            $row[] = $x;
            $data[] = implode("','",$row);    
            }
}
foreach ($data as $id) {
    echo "<pre>";
    var_dump($id);
    echo "</pre>";
    $query="INSERT INTO csv_test3 VALUES ('$id')";
    $init=mysql_query($query);
}

这是代码的一部分,它基本上采用 csv 文件,格式如 @OP 所述,将其转换并将所有内容转储到 mysql 表中。

于 2013-05-09T08:14:13.387 回答
0

您有 2 个选项:

  1. 将数组存储为 mysql 中的序列化(对列使用 blob 类型)
  2. 将数组编码为 json 并将其存储在 mysql 的 blob 列中

更新:序列化的示例代码,请记住,blob_test2表有一个插入序列化数组的 blob 列

$file = "_ss.csv";
$lines = file($file);
$count = count($lines);
$data = array();
$i = 0;
foreach($lines as $value){
    $value = explode(";", $value);
    $query="INSERT INTO blob_test2 VALUES ('".serialize($value)."')";
    $init=mysql_query($query);
}
于 2013-05-08T09:25:03.190 回答
0

首先,我建议你打印出查询。我对您的代码进行了一些修改以打印查询:

$file = "_ss.csv";
$lines = file($file);
$count = count($lines);
$data = array();
$i = 0;
foreach($lines as $value){
    $value = explode(";", $value);
    $first = array_splice($value, 0, 2); 

    foreach($value as $x){

        $row = $first;
        $row[] = $x;
        $data[] = implode(',', $row);
        $dump = implode(',', $data);
        $query="INSERT INTO csv_test2 VALUES ('$dump')";
        echo $query."<br/>";
        //$init=mysql_query($query);

        $i++;
    //echo $dump."<br/>";
    }
}

在我这边,它打印类似于:

INSERT INTO csv_test2 VALUES ('a,a1,1')
  • 如果您的表csv_test2仅包含一个存储文本类型的字段(可以是 varchar、char、...),则此查询可以。
  • 但是,如果它包含更多需要/需要的字段(不为空、唯一、...),则此查询将不起作用。你需要写:

    插入 csv_test2(a_field_name) 值 ('a,a1,1')

  • 但是,如果您想插入数组的每个元素对应于每个字段,那么您的代码在这种情况下将不起作用。您需要像这样进行查询:

    INSERT INTO csv_test2 VALUES ('a','a1','1') 所以,你需要做$dump = implode("','", $data);

于 2013-05-08T14:14:24.000 回答
0

您可以按照以下步骤操作

  1. 将数据转换为excel格式
  2. 用 \ 转义所需的字符
  3. 再次将其转换为 csv
  4. 然后使用程序或任何其他导入工具导入
于 2013-05-08T09:33:45.503 回答
0
$data = array();
foreach($lines as $value) {
    $value = explode(";", $value);

    $first = array_splice($value, 0, 2);
    unset($value[3]); // <---------------------- point
    foreach($value as $x){

        $first[]=$x;

        $data[] = $first;
    }
}

foreach($data as $v){
    $dump = implode(',', $v);
    $query="INSERT INTO csv_test2 VALUES ('$dump')";
    $init=mysql_query($query);
}

//mysql not good pls mysqli
于 2013-05-08T09:36:13.667 回答
0

在 foreach 中没有查询有更好的方法:

$data = array();

foreach ($lines as $value){
  // do something
  $data[] = "('".serialize($value)."')";
}

$query = mysql_query("INSERT INTO csv_test2 VALUES".implode(',', $data)."");
  • MySQL 扩展已弃用,将来将被删除,请使用 MySQLi 或 PDO。
于 2013-05-08T10:06:22.353 回答