使用PHP获取CSV文件的一部分的有效方法

时间:2015-09-04 13:05:31

标签: php csv

假设我需要CSV文件中第50行到第100行的所有数据。 我想知道是否有更有效的方法从循环遍历每一行并检查当前行是否在50到100之间? 现在我有一个简单的代码可以正常工作,但是如果我想要一个接近CSV文件末尾的范围,那么它会变得有点慢。

$start = 200000; 
$end = 200050;
$handle = fopen("test.csv", "r");
$i = 0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if(($start <= $i) && ($i <= $end)) {
    echo $data[0] . ' - ' . $data[1] . ' - ' . $data[2] . ' - ' . $data[3];
    echo '<br />';
}
elseif($i > $end) {
    break;
}
$i++;
}

fclose($handle);

有没有办法可以使用偏移或类似的东西,所以我不必遍历每一行?

更新 该解决方案需要使用更大的文件。内存是有限的,因此将整个文件读入内存将无法正常工作。

5 个答案:

答案 0 :(得分:0)

您可以使用:

$filename = "data.csv";

// Read the file into an array
$lines = file($filename);

// Output the 50th line
echo $lines[49];

因此,使用您的示例,您可以使用以下方法轻松输出所需的50行:

for($i=0; $i<50; $i++) {
    echo $lines[$i + 50] . '<br/>;
}

查看有关PHP file功能

的文档

答案 1 :(得分:0)

以下代码将逐行读取大文件

<?php    
    function readLine ($linenum,$fh) {
                $line = fgets ($fh, 4096);
                $pos = -1;
                $i = 0;

                while (!feof($fh) && $i<($linenum-1)) {
                    $char = fgetc($fh);
                    if ($char != "\n" && $char != "\r") {
                        fseek($fh, $pos, SEEK_SET);
                        $pos ++;
                    }
                    else $i ++; 
                }
                $line = fgets($fh);
                return $line;
            } //readLine()
    ?>

答案 2 :(得分:0)

好的,所以你有一个CSV数据文件,可能包含大量的记录,你需要能够深入到文件的下游直接读取,而不必阅读文件的其余部分第一

是的,可以这样做 - 您需要使用fseek()来移动文件位置指针:

$handle = fopen(....);
....
$startAt = 10000;
$success = fseek($handle, $startAt);
$data = fgets($fp, 1000);  //read the next 1000 bytes of the file after the starting position.

然而,这对你来说并不像那个例子那样容易看起来。

您的CSV数据几乎肯定有可变长度的线条。这意味着你不能只是告诉它跳转到特定的字节位置并知道它是什么行。您必须有办法知道要跳转到的记录的特定起始字节位置。如果编辑了任何记录,您之前记住的那些字节位置将变得不正确。

如果您只是将它用于分页,那么您可以通过记住前一页的字节位置并按当前位+1来计算下一页的开头。

但跳转到文件周围的任意记录 - 例如随机访问,给定记录号 - 几乎是不可能的,除非你保留所有行结尾所在字节位置的最新索引。 (如果你这样做,那么你将有效地实现一个基本的ISAM数据库)

真正的问题是为什么(根据你的评论)数据库是不可能的。好吧,也许你不能安装mySQL,但是一个简单的SQLite数据库可以完全从你的PHP程序中创建和管理,只在磁盘上创建一个文件;在这方面,它几乎和CSV一样方便,如果你获得的数据不仅仅是一小部分,那肯定更容易使用。

答案 3 :(得分:0)

        ////insert and view screen////////////


        <!DOCTYPE html>
        <html>
            <head>
                <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
                <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes" />
                <meta charset="UTF-8" />
                <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

                <!-- jQuery library -->
                <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

                <!-- Latest compiled JavaScript -->
                <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
                <!-- The above 3 meta tags must come first in the head -->

                <title>Demo</title>
            </head>
            <body>
                <div class="formme">

                    <?php
                    if (isset($_POST['submit']) == "Submit") {

                        $inputPost = $_POST;
                        $name = isset($inputPost['fname']) ? $inputPost['fname'] : "";
                        $email = isset($inputPost['lname']) ? $inputPost['lname'] : "";
                        $subject = isset($inputPost['telNo']) ? $inputPost['telNo'] : "";
                        $message = "";

                        $file_open = fopen("contact_data.csv", "a");
                        $no_rows = count(file("contact_data.csv"));
                        if ($no_rows > 1) {
                            $no_rows = ($no_rows - 1) + 1;
                        }
                        $form_data = array(
                            'sr_no' => $no_rows,
                            'name' => $name,
                            'email' => $email,
                            'subject' => $subject,
                            'message' => $message
                        );
                        fputcsv($file_open, $form_data);
                    }
                    //fclose($form_data);



                    $row = 1;
                    if (($handle = fopen("contact_data.csv", "r")) !== FALSE) {

                        echo '<table border="1" style="width:60%;" ><tr><td>Id</td><td>UserName</td><td>Email</td><td>message</td><td>Edit</td><td>Delete</td></tr>';

                        while (($data = fgetcsv($handle, 1000)) !== FALSE) {
                            $num = count($data);

                            $datainfo = array_filter($data);
                            if(!empty($datainfo)){
                                echo '<tr>';
                                echo '<td>' . $data[0] . '</td><td>' . $data[1] . '</td><td>' . $data[2] . '</td><td>' . $data[3] . '</td><td><a href="editcsvdetails.php?id=' . $data[0] . '" >edit</a></td><td><a href="deletecsvdetails.php?id=' . $data[0] . '" >delete</a></td>';
                                echo '</tr>';
                            }

                            $row++;
                        }

                        echo '</tbody></table>';
                        fclose($handle);
                    }


                    ?>


                    <form name="csvForm"  id="csvForm" method="post">


                        <div class="form-1">
                            <div class="col-1">
                                <label for="fname" class="fname">First name</label>
                            </div>
                            <div class="ph-1">
                                <input type="text" id="fname" name="fname" placeholder="Your name.." vale="">
                            </div>
                        </div>

                        <div class="form-2">
                            <div class="col-2">
                                <label for="lname" class="lname">Last name</label>
                            </div>
                            <div class="ph-2">
                                <input type="text" id="lname" name="lname" placeholder="Your last name.." vale="">
                            </div>
                        </div>

                        <div class="form-3">
                            <div class="col-3">
                                <label for="telNo" class="tel">Phone number</label>
                            </div>
                            <div class="ph-3">
                                <input type="tel" id="telNo" name="telNo" placeholder="Your phone number..." vale="">
                            </div>
                        </div>

                        <div class="btn">
                            <!--<button class="formSubmit" name="submit" id="submit">Submit</button>-->
                            <input type="submit" name="submit" id="submit" value="Submit">
                        </div>
                    </form>
                </div>
            </body>
            <script>
               /* function editcsv($id)
                {
                    var id = $id;
                    $.ajax({
                        url: "http://localhost/practise/csv/editcsv.php",
                        type: "post",
                        dataType: "json",
                        data: {id: id},
                        success: function (data)
                        {
                            alert(data.msg);

                        }

                    });
                    // alert($id);
                }
                function deletecsv()
                {

                }
        */
            </script>

        </html>


    > /////edit and//////////////////


    <?php

    if (isset($_POST['submit']) == "Submit")
    {
        $inputPost = $_POST;
        $id = $_POST['id'];
        $name = isset($inputPost['fname']) ? $inputPost['fname'] : "";
        $lname = isset($inputPost['lname']) ? $inputPost['lname'] : "";
        $telephone = isset($inputPost['telNo']) ? $inputPost['telNo'] : "";

        $i = 0;
        $newdata = [];
        $handle = fopen("contact_data.csv", "r");

        // READ CSV
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {

            if ($data[0] == $id) {
                $newdata[$i][] = $id;
                $newdata[$i][] = $name;
                $newdata[$i][] = $lname;
                $newdata[$i][] = $telephone;

                $i++;
                continue;
            }
            $newdata[$i][] = $data[0];
            $newdata[$i][] = $data[1];
            $newdata[$i][] = $data[2];
            $newdata[$i][] = $data[3];
            $i++;
        }
        fclose($handle);
        // EXPORT CSV
        $fp = fopen("contact_data.csv", 'w');
        foreach ($newdata as $rows) {
            fputcsv($fp, $rows);
        }
        fclose($fp); 
        ?>
        <script type="text/javascript">
          window.location.href='index.php';
        </script>
        <?php
    }

    ?>
    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
            <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes" />
            <meta charset="UTF-8" />
            <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

            <!-- jQuery library -->
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

            <!-- Latest compiled JavaScript -->
            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
            <!-- The above 3 meta tags must come first in the head -->

            <title>Demo</title>
        </head>
        <body>
            <div class="formme">
                <?php 
                if(isset($_GET['id']))
                {
                    $value = $_GET['id']; // Wert dieser Spalte

                    if (($handle = fopen("contact_data.csv", "r")) !== FALSE) {
                         while (($data = fgetcsv($handle, 1000)) !== FALSE) {
                            /*$datainfo = array_filter($data);
                            if(!empty($datainfo)){


                            }*/
                            if ($data[0] == $value) { 

                            ?>
                            <form name="csvForm"  id="csvForm" method="post">
                                <input type="hidden" id="id" name="id"  value="<?php echo $data[0]; ?>">
                                <div class="form-1">
                                    <div class="col-1">
                                        <label for="fname" class="fname">First name</label>
                                    </div>
                                    <div class="ph-1">
                                        <input type="text" id="fname" name="fname" placeholder="Your name.." value="<?php echo $data[1]; ?>">
                                    </div>
                                </div>

                                <div class="form-2">
                                    <div class="col-2">
                                        <label for="lname" class="lname">Last name</label>
                                    </div>
                                    <div class="ph-2">
                                        <input type="text" id="lname" name="lname" placeholder="Your last name.." value="<?php echo $data[2]; ?>">
                                    </div>
                                </div>

                                <div class="form-3">
                                    <div class="col-3">
                                        <label for="telNo" class="tel">Phone number</label>
                                    </div>
                                    <div class="ph-3">
                                        <input type="tel" id="telNo" name="telNo" placeholder="Your phone number..." value="<?php echo $data[3]; ?>">
                                    </div>
                                </div>

                                <div class="btn">
                                    <!--<button class="formSubmit" name="submit" id="submit">Submit</button>-->
                                    <input type="submit" name="submit" id="submit" value="Submit">
                                </div>
                            </form>
                            <?php }
                         }

                    }
                }
                ?>

            </div>
        </body>
        </html>


> //////Delete csv record/////


<?php 
$id = $_GET['id'];
if($id) {
    $file_handle = fopen("contact_data.csv", "w+");
    $myCsv = array();
    while (!feof($file_handle) ) {
        $line_of_text = fgetcsv($file_handle, 1024);    
        if ($id != $line_of_text[0]) {
            fputcsv($file_handle, $line_of_text);
        }
    }
    fclose($file_handle);
     ?>
    <script type="text/javascript">
      window.location.href='index.php';
    </script>
    <?php
}

?>

答案 4 :(得分:-1)

for($i=49; $i<100;$i++) {
    echo $lines[$i].PHP_EOL;
}