【发布时间】:2014-04-16 18:57:54
【问题描述】:
我有一个粗略而完整的 CSV 转换器。我当前系统的工作方式是将 CSV 文件导入到具有静态列名的 SQL 数据库表中,并且仅导出特定(需要的)列。该系统运行良好,但仅特定于一种类型的 CSV 文件(因为列名是预定义的。)我想知道如何使这个通用。而不是让它插入 column1、column2、column3。我想插入电子表格 Column1、电子表格 Column2、电子表格 Column3 等。我将如何从 CSV 文件中提取列名,并在数据库中创建一个新表,列名来自 CSV 的第一行文件。
当前系统:
- 客户端上传 CSV 文件。
- 使用预定义的列名(第 1 列、第 2 列、第 3 列)创建表
- 使用 LOAD DATA INFILE -> PHP 脚本会将 CSV 文件中的信息插入到最近创建的表中。
- 运行的下一个查询只是从表中取出特定列并将其导出到最终的 CSV 文件。
理想的系统:
- 客户端上传 CSV 文件。
- PHP 脚本读取 CSV 文件并仅获取第一行(列名),获取这些列名后,它将根据列名创建一个新表。
- PHP 脚本现在使用 LOAD DATA INFILE。
- 其余与当前系统相同。
当前代码:
import.php
include("/inc/database.php");
include("/inc/functions.php");
include("/inc/data.php");
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$string = random_string(7);
$new_file_name = 'report_'. $string .'.csv';
$themove = move_uploaded_file($_FILES['csv']['tmp_name'], 'C:/xampp/htdocs/uploads/'.$new_file_name);
mysql_query("CREATE TABLE report_". $string ."(". $colNames .")") or die(mysql_error());
$sql = "LOAD DATA INFILE '/xampp/htdocs/uploads/report_". $string .".csv'
INTO TABLE report_". $string ."
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(". $insertColNames .")";
$query = mysql_query($sql) or die(mysql_error());
header('Location: download.php?dlname='.$string.'');
}
data.php(缩短了大部分内容。实际上大约有 200 列进入,230 列出来)
<?php
$colNames = "Web_Site_Member_ID text,
Master_Member_ID text,
API_GUID text,
Constituent_ID text";
$insertColNames = "Web_Site_Member_ID,
Master_Member_ID,
API_GUID,
Constituent_ID";
$exportNames = "Web_Site_Member_ID, Date_Membership_Expires, Membership, Member_Type_Code";
?>
functions.php 仅包含用于生成随机字符串/文件名的代码块。
【问题讨论】:
-
我认为您应该尝试编写您所要求的代码,并在遇到精确问题时向我们提出更精确的问题。
-
发布您当前的代码。
-
啊,CSV。你用
fgetcsv了吗? -
Anthony,感谢您发布您的代码,但我仍然没有看到您尝试在示例中使用 fgetcsv 函数。如果我们看不到您做错了什么,我们将无法帮助您。