我想使用 PHP 上传一个 CSV 文件,上传完成后,希望能够显示该文件的数据。请提供一个示例,演示如何完成这个任务。
现在可以用更简单的方式来完成这个任务。
$tmpName = $_FILES['csv']['tmp_name'];
$csvAsArray = array_map('str_getcsv', file($tmpName));
这将为您返回一个解析后的CSV数据数组。然后您可以使用foreach语句循环遍历它。
explode(<delimiter>, $csv)
您可以分离每个字段,并在 CSV 数组的每个元素内拥有一个字段数组。 - Villapalos未经测试但应该能够给您一个想法。视图代码:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="csv" value="" />
<input type="submit" name="submit" value="Save" /></form>
上传文件的 upload.php 控制器:
$csv = array();
// check there are no errors
if($_FILES['csv']['error'] == 0){
$name = $_FILES['csv']['name'];
$ext = strtolower(end(explode('.', $_FILES['csv']['name'])));
$type = $_FILES['csv']['type'];
$tmpName = $_FILES['csv']['tmp_name'];
// check the file is a csv
if($ext === 'csv'){
if(($handle = fopen($tmpName, 'r')) !== FALSE) {
// necessary if a large csv file
set_time_limit(0);
$row = 0;
while(($data = fgetcsv($handle, 1000, ',')) !== FALSE) {
// number of fields in the csv
$col_count = count($data);
// get the values from the csv
$csv[$row]['col1'] = $data[0];
$csv[$row]['col2'] = $data[1];
// inc the row
$row++;
}
fclose($handle);
}
}
}
$csv[$row]['row1'] = $data[0];
这个命名有误导性,应该改成 $csv[$row]['column1'] = $data[0];
。无论如何,更好的解决方案是使用 $csv[$row]=$data
,并将整个文件制作成多维数组。 - kmoney12<table width="600">
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">
<tr>
<td width="20%">Select file</td>
<td width="80%"><input type="file" name="file" id="file" /></td>
</tr>
<tr>
<td>Submit</td>
<td><input type="submit" name="submit" /></td>
</tr>
</form>
</table>
PHP:
if ( isset($_POST["submit"]) ) {
if ( isset($_FILES["file"])) {
//if there was an error uploading the file
if ($_FILES["file"]["error"] > 0) {
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else {
//Print file details
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
//if file already exists
if (file_exists("upload/" . $_FILES["file"]["name"])) {
echo $_FILES["file"]["name"] . " already exists. ";
}
else {
//Store file in directory "upload" with the name of "uploaded_file.txt"
$storagename = "uploaded_file.txt";
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $storagename);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"] . "<br />";
}
}
} else {
echo "No file selected <br />";
}
}
我知道一定有更简单的方法,但我读取了CSV文件并将每条记录的单元格存储在一个二维数组中。if ( isset($storagename) && $file = fopen( "upload/" . $storagename , r ) ) {
echo "File opened.<br />";
$firstline = fgets ($file, 4096 );
//Gets the number of fields, in CSV-files the names of the fields are mostly given in the first line
$num = strlen($firstline) - strlen(str_replace(";", "", $firstline));
//save the different fields of the firstline in an array called fields
$fields = array();
$fields = explode( ";", $firstline, ($num+1) );
$line = array();
$i = 0;
//CSV: one line is one record and the cells/fields are seperated by ";"
//so $dsatz is an two dimensional array saving the records like this: $dsatz[number of record][number of cell]
while ( $line[$i] = fgets ($file, 4096) ) {
$dsatz[$i] = array();
$dsatz[$i] = explode( ";", $line[$i], ($num+1) );
$i++;
}
echo "<table>";
echo "<tr>";
for ( $k = 0; $k != ($num+1); $k++ ) {
echo "<td>" . $fields[$k] . "</td>";
}
echo "</tr>";
foreach ($dsatz as $key => $number) {
//new table row for every record
echo "<tr>";
foreach ($number as $k => $content) {
//new table cell for every field of the record
echo "<td>" . $content . "</td>";
}
}
echo "</table>";
}
希望这能有所帮助,这只是一小段代码,我还没有测试过,因为我使用了稍微不同的方式。注释应该可以解释一切。
$content
,该怎么办?我正在尝试在这里实现:http://stackoverflow.com/questions/14536221/how-to-pass-the-data-into-the-text-fields - Sumit Gera$tmpName = $_FILES['csv']['tmp_name'];
$csv_data = array_map('str_getcsv', file($tmpName));
array_walk($csv_data , function(&$x) use ($csv_data) {
$x = array_combine($csv_data[0], $x);
});
/**
*
* array_shift = remove first value of array
* in csv file header was the first value
*
*/
array_shift($csv_data);
// Print Result Data
echo '<pre/>';
print_r($csv_data);
它将会得到以下结果
Array
(
[0] => Array
(
[make] => Audi
[model] => S4
[grade] =>
[chassis] => WAUZZZ8K9DA076529
[year] => 2012
[kms] => 127000
[color] => White
[doors] => 4
[cc] => 3000
[engineno] =>
[trans] => FAT
[fueltype] => P
[condition] => 4
[price] => 15753
)
)
您想查看PHP手册中的文件上传处理部分,同时建议您也查看fgetcsv()和explode()函数。
我认为 str_getcsv
— 将 CSV 字符串解析为数组是您的最佳选择。
您需要将文件上传到服务器。
使用 str_getcsv 解析文件。
遍历数组并根据您网站的需求进行对齐。
public function uploadCsvFile(){
try{
if($_SERVER['REQUEST_METHOD'] === 'POST'){
$request = $this->post();
$fileName = $request->file;
$file = fopen($fileName, "r"); //open the file
// $fileName = $_FILES["file"]["tmp_name"];
while(($column = fgetcsv($file)) !== FALSE){
$num = count($column);
$this->dbw->query("insert into csv_upload(first_name,last_name,email,phone,address,pin) values('".$column[0]."','".$column[1]."','".$column[2]."','".$column[3]."','".$column[4]."','".$column[5]."')");
}
fclose($file);
}
}catch (Exception $e) {
$this->responseErr($e->getMessage(), 500);
}
}
function doParseCSVFile($filesArray)
{
if ((file_exists($filesArray['frmUpload']['name'])) && (is_readable($filesArray['frmUpload']['name']))) {
$strFilePath = $filesArray['frmUpload']['tmp_name'];
$strFileHandle = fopen($strFilePath,"r");
$line_of_text = fgetcsv($strFileHandle,1024,",","'");
$line_of_text = fgetcsv($strFileHandle,1024,",","'");
do {
if ($line_of_text[0]) {
$strInsertSql = "INSERT INTO tbl_employee(employee_name, employee_code, employee_email, employee_designation, employee_number)VALUES('".addslashes($line_of_text[0])."', '".$line_of_text[1]."', '".addslashes($line_of_text[2])."', '".$line_of_text[3]."', '".$line_of_text[4]."')";
ExecuteQry($strInsertSql);
}
} while (($line_of_text = fgetcsv($strFileHandle,1024,",","'"))!== FALSE);
} else {
return FALSE;
}
}
function doParseCSVFile($filesArray)
{
if ((file_exists($filesArray['frmUpload']['name'])) && (is_readable($filesArray['frmUpload']['name']))) {
$strFilePath = $filesArray['frmUpload']['tmp_name'];
$strFileHandle = fopen($strFilePath,"r");
$line_of_text = fgetcsv($strFileHandle,1024,",","'");
$line_of_text = fgetcsv($strFileHandle,1024,",","'");
do {
if ($line_of_text[0]) {
$strInsertSql = "INSERT INTO tbl_employee(employee_name, employee_code, employee_email, employee_designation, employee_number)VALUES('".addslashes($line_of_text[0])."', '".$line_of_text[1]."', '".addslashes($line_of_text[2])."', '".$line_of_text[3]."', '".$line_of_text[4]."')";
ExecuteQry($strInsertSql);
}
} while (($line_of_text = fgetcsv($strFileHandle,1024,",","'"))!== FALSE);
} else {
return FALSE;
}
}
$_FILES
数组来访问上传的文件。该数组包含上传文件的属性,例如文件名、类型、大小和临时文件名。在处理上传文件之前,你需要验证文件类型和大小,并确保目标文件夹有写入权限。最后,你可以使用 PHP 内置的函数(例如move_uploaded_file()
)将上传的文件保存到指定的位置。 - Pekkafgetcsv()
是 PHP 手册中的一个函数,用于从文件中读取一行并解析为 CSV 格式。该函数返回一个数组,其中包含解析后的字段。如果没有更多行可供读取,则返回 false。 - Pekka