德鲁巴 7 |将 CSV 逐行导入自定义 table
Drupal 7 | Import CSV, row by row, into custom table
假设我有这样的 CSV:
value1,value2
value1,value2
和一个有两列的 table
column1|column2
如何以编程方式将 CSV 文件导入 table?
这个模块可能对你有帮助
https://www.drupal.org/sandbox/draenen/2442165
它需要 Feed,但它扩展了它以使用自定义表(非 drupal 实体)
这就是我的想法 - 我不是 PHP 专家 - 它看起来并不漂亮 - 但它有效!
$handle = fopen('/path/to/file/filename.csv', 'r');
$row = fgetcsv($handle);
for ($e = 0; $row = fgetcsv($handle); $e++) {
$record = array();
foreach ($row as $field) {
$record[] = $field;
}
db_insert('your_db_table')
->fields(array(
'column1' => $record[0],
'column2' => $record[1]
))
->execute();
}
fclose($handle);
table 将如下所示:
column1|column2
---------------
value1|value2
value1|value2
@erier 的回答非常好,可以完成工作。
由于问题是用 Drupal 7 标记的,我想我会提交一个 Drupal 自定义模块方法,改编@erier 的答案并对其进行美化。
关于自定义模块的基础知识,你可以看这个简单的例子。
function custom_module_form($form, &$form_state) {
$form['csv_upload'] = array(
'#type' => 'file',
'#title' => t('Choose a file'),
'#title_display' => 'invisible',
'#size' => 22,
'#upload_validators' => array('file_clean_name' => array()),
);
$form['upload'] = array(
'#type' => 'submit',
'#value' => 'Upload',
);
}
function custom_module_form_validate($form, &$form_state) {
$validators = array('file_validate_extensions' => array('csv'));
// Check for a new uploaded file.
$file = file_save_upload('csv_upload', $validators);
//$file = $form_state['values']['csv_upload'];
if (isset($file)) {
// File upload was attempted.
if ($file) {
// Put the temporary file in form_values so we can save it on submit.
$form_state['values']['csv_upload_file'] = $file;
}
else {
// File upload failed.
form_set_error('csv_upload', t('The file could not be uploaded.'));
}
}
}
function custom_module_submit($form, &$form_state) {
$file = $form_state['values']['csv_upload_file'];
$file->status = FILE_STATUS_PERMANENT;
$file->filename = str_replace(' ', '_', $file->filename);
file_save($file);
$csv_file = file_load($file->fid);
$file = fopen($csv_file->uri, "r");
while(! feof($file))
{
$customer = fgetcsv($file));
db_insert('your_db_table')
->fields(array(
'column1' => $customer[0],
'column2' => $customer[1]
))
->execute();
}
fclose($file);
drupal_set_message('CSV data added to the database');
}
function file_clean_name($file) {
$file->filename = str_replace(' ', '_', $file->filename);
}
假设您的问题是关于数据库的 table。
如果你想进入 html table,你可以像这样在 $csv_file = file_load($file->fid);
之后调整提交功能:
$headers = array('column 1', 'column 2');
$rows = array();
$file = fopen("contacts.csv","r");
while(! feof($file))
{
$customer = fgetcsv($file));
$rows[] = array($customer[0], $customer[1]);
}
fclose($file);
return theme('table', array('header' => $headers, 'rows' => $rows);
或者通过将数据添加到数据库并在屏幕上显示而无需再次访问数据库来调整两者。
假设我有这样的 CSV:
value1,value2
value1,value2
和一个有两列的 table
column1|column2
如何以编程方式将 CSV 文件导入 table?
这个模块可能对你有帮助 https://www.drupal.org/sandbox/draenen/2442165 它需要 Feed,但它扩展了它以使用自定义表(非 drupal 实体)
这就是我的想法 - 我不是 PHP 专家 - 它看起来并不漂亮 - 但它有效!
$handle = fopen('/path/to/file/filename.csv', 'r');
$row = fgetcsv($handle);
for ($e = 0; $row = fgetcsv($handle); $e++) {
$record = array();
foreach ($row as $field) {
$record[] = $field;
}
db_insert('your_db_table')
->fields(array(
'column1' => $record[0],
'column2' => $record[1]
))
->execute();
}
fclose($handle);
table 将如下所示:
column1|column2
---------------
value1|value2
value1|value2
@erier 的回答非常好,可以完成工作。
由于问题是用 Drupal 7 标记的,我想我会提交一个 Drupal 自定义模块方法,改编@erier 的答案并对其进行美化。
关于自定义模块的基础知识,你可以看这个简单的例子。
function custom_module_form($form, &$form_state) {
$form['csv_upload'] = array(
'#type' => 'file',
'#title' => t('Choose a file'),
'#title_display' => 'invisible',
'#size' => 22,
'#upload_validators' => array('file_clean_name' => array()),
);
$form['upload'] = array(
'#type' => 'submit',
'#value' => 'Upload',
);
}
function custom_module_form_validate($form, &$form_state) {
$validators = array('file_validate_extensions' => array('csv'));
// Check for a new uploaded file.
$file = file_save_upload('csv_upload', $validators);
//$file = $form_state['values']['csv_upload'];
if (isset($file)) {
// File upload was attempted.
if ($file) {
// Put the temporary file in form_values so we can save it on submit.
$form_state['values']['csv_upload_file'] = $file;
}
else {
// File upload failed.
form_set_error('csv_upload', t('The file could not be uploaded.'));
}
}
}
function custom_module_submit($form, &$form_state) {
$file = $form_state['values']['csv_upload_file'];
$file->status = FILE_STATUS_PERMANENT;
$file->filename = str_replace(' ', '_', $file->filename);
file_save($file);
$csv_file = file_load($file->fid);
$file = fopen($csv_file->uri, "r");
while(! feof($file))
{
$customer = fgetcsv($file));
db_insert('your_db_table')
->fields(array(
'column1' => $customer[0],
'column2' => $customer[1]
))
->execute();
}
fclose($file);
drupal_set_message('CSV data added to the database');
}
function file_clean_name($file) {
$file->filename = str_replace(' ', '_', $file->filename);
}
假设您的问题是关于数据库的 table。
如果你想进入 html table,你可以像这样在 $csv_file = file_load($file->fid);
之后调整提交功能:
$headers = array('column 1', 'column 2');
$rows = array();
$file = fopen("contacts.csv","r");
while(! feof($file))
{
$customer = fgetcsv($file));
$rows[] = array($customer[0], $customer[1]);
}
fclose($file);
return theme('table', array('header' => $headers, 'rows' => $rows);
或者通过将数据添加到数据库并在屏幕上显示而无需再次访问数据库来调整两者。