php - 使用 PHP 跳过 csv 的特定行和列

标签 php html mysql csv

您好,我想知道如何从 csv 中跳过某些列/行。我有一个将 cvs 上传到 MySQL 的表单并且工作正常,我也知道如何跳过 csv 的第一行,但是我需要上传的文件的格式对我来说似乎很难。这是我的代码:

<body>

<div class="container">

[enter image description here][1]<?php
if(isset($_POST['uploadBtn'])){
    $fileName=$_FILES['myFile']['name'];
    $fileTmpName=$_FILES['myFile']['tmp_name'];
    //FILE PATH
    $fileExtension=pathinfo($fileName,PATHINFO_EXTENSION);
    //ALLOWED FILE TYPES
    $allowedType = array('csv');
    if(!in_array($fileExtension,$allowedType)){?>

        <div class="alert alert-danger">
            INVALID FILE
        </div>
    <?php }else{

        $handle = fopen($fileTmpName, 'r');
        fgetcsv($handle);///////////////// SKIP FIRST ROW
        while (($myData = fgetcsv($handle,1000,','))!== FALSE){
                $name = $myData[0];
                $email = $myData[1];

                $query = "INSERT INTO databse.excel_table (name,email)
                VALUES ('".$name."','".$email."')";
                $run = mysql_query($query);

        }
        if(!$run){
            die("error in uploading file".mysql_error());
        }else{ ?>
                <div class="alert alert-success">
                    SUCCESS
                </div>
    <?php   }
    }
}
    ?>

<form action="" method="post" enctype="multipart/form-data">
    <h3 class="text-center">
        RESULTS
    </h3></hr>
    <div class="row">
        <div class="col-md-6">
            <div class="form-group">
                <input type="file" name="myFile" class="form-control">
            </div>
        </div>
    </div>
    <div class="row">
        <div class="col-md-6">
            <div class="form-group">
                <input type="submit" name ="uploadBtn" class="btn btn-info">
            </div>
        </div>
    </div>
</form>
</div>
</body>
</html>

提前致谢。 example of csv

最佳答案

使用循环,这是一种实现这一目标的方法。

使用其中之一,而不是两者都使用。

$rowsToSkip = [0,3,6,9]; //this is one way to manually enter row numbers
$rowsToSkip = range(5,10) //will return an array ex: [5,6,7,8,9,10]

并设置您的循环

$i = 0; //this is used to keep an track of what row you are on
while (($myData = fgetcsv($handle,1000,','))!== FALSE){
  if($i == 0) continue; //this will skip your 1st row
  if(in_array($i, $rowsToSkip)) continue; //this will skip any row in $rowsToSkip array

  $name = $myData[0];
  $email = $myData[1];

  $query = "INSERT INTO databse.excel_table (name,email)
  VALUES ('".$name."','".$email."')";
  $run = mysql_query($query);
}

2 条建议/有帮助,但不是实现此功能所必需的

  • 不要在任何for/while/each中查询,最好先把字符串放在一起再查询一次。

  • 不要使用 mysql,它旧且不安全。使用 PDO 或 mysqli 代替

再次循环

$i = 0; //this is used to keep an track of what row you are on
$values = []; //will hold your row values
while (($myData = fgetcsv($handle,1000,','))!== FALSE){
  if($i == 0) continue; //this will skip your 1st row
  if(in_array($i, $rowsToSkip)) continue; //this will skip any row in $rowsToSkip array

  $name = $myData[0];
  $email = $myData[1];

  $values[] = "('".$name."','".$email."')";
}

将查询从循环中取出,稍后使用 implode 添加值

$query = "INSERT INTO databse.excel_table (name,email) VALUES (". implode("," , $values) .")";
$run = mysql_query($query);

关于php - 使用 PHP 跳过 csv 的特定行和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46941866/

相关文章:

javascript - 在铁路由器中添加背景颜色

javascript - 我可以使用 JAVASCRIPT/jQuery 将表单中的输入保存到 HTML 中的 .txt,然后使用它吗?

php - 在 php 代码中插入复选框

php - 使用 "saved"搜索进行数据分页

使用 shell_exec(bash read) 的 PHP 在 tty 上工作,但在输入通过管道传输且没有换行符时不起作用

javascript - 使用 Bootstrap3 为 block 中的 div 设置相同的高度

php sql 表单在同一页面上提交,但 sql 加载太早而给出错误

php - PDO 检索二维数组而不是一维数组

mysql - 在 MySQL 中修改十进制键表的最快方法?

php - 集成测试模拟外观与注入(inject)模拟