Announcement

Collapse
No announcement yet.

[Nhờ giúp đỡ] - Đọc, ghi file trong PHP

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [PHP] [Nhờ giúp đỡ] - Đọc, ghi file trong PHP

    Mình có một file lớn (khoảng vài trăm ngàn dòng), mỗi dòng là một số nguyên kiểu int.

    Nhờ mọi người cách nhanh nhất để truy xuất đến một dòng bất kì trong file.
    VD

    5
    6
    8
    9
    14
    12
    11

    Ví dụ mình muốn truy xuất đến dòng thứ 6 và tăng giá trị của nớ lên 1.

    Cảm ơn mọi người quan tâm.

  • #2
    Anh tham khảo những đoạn code này xem sao ...

    PHP Code:
    function getLine($file$lineno)
     {
         
    $line=false;
         
    $fp=fopen($file'r');
         while (!
    feof($fp) && $lineno--)
         {
             
    $line=fgets($fp);
         }
         
    fclose($file);
         return (
    $lineno==0)?$line:false;
     
     }
     
    // first count num of line 
     
     
    now you put in array your replace
     
     
    function readWrite($data$){
     
     
    $file file($data);
     
    $i 1// the [x]th row you'd like to change (1 means the second row)
     
     
    $yourArray = array("purple","grey","pink","cyan");
     
    $row explode(",",$file[$i]);
     
     for (
    $j=0;$j<count($row);$j++) {
     
    $row[$j] = $yourArray[$j];
     }
     
    $file[$i] =implode(",",$row)."\n";
     
    $content implode("",$file);
     
    $open fopen($data,"w");
     
    fwrite($open,$content);
     }
    //
    $data "yourFile.txt"
    Other way ...
    PHP Code:
    <?
     
     $key = 'strawberry4';
     $newline = 'blackberry';
     
     //copy file to prevent double entry
     $file = "file.txt";
     $newfile = "filetemp.txt";
     copy($file, $newfile) or exit("failed to copy $file");
     
     //load file into $lines array
      $fc = fopen ($file, "r");
      while (!feof ($fc)) 
      {
         $buffer = fgets($fc, 4096);
         $lines[] = $buffer;
      }
     
     fclose ($fc);
     
     //open same file and use "w" to clear file 
     $f=fopen($newfile,"w") or die("couldn't open $file");
     
     /* uncomment to debug
     print_r($lines);
     print "<br>\n";
     */
     
     //loop through array using foreach
     foreach($lines as $line)
     {
            fwrite($f,$line); //place $line back in file    
         if (strstr($line,$key)){ //look for $key in each line
         fwrite($f,$newline."\n");
         } //place $line back in file 
     }
     fclose($f);
     
     copy($newfile, $file) or exit("failed to copy $newfile");
     ?>
    find character 'uitce' inside file file.txt...
    PHP Code:
    <?php 
     $handle 
    file_get_contents("file.txt",NULL); 
     
    $a="uitce"
     
    $a=str_replace(",","",$a); 
     
    $a=explode(" ",$a); 
     
    $c=0
     foreach(
    $a as $y){ 
     if (
    stristr($handle,"$a[$c]")) $b[]= 'yes'
     else 
    $b[]='no'
     
    $c++; 
     } 
     echo 
    $handle
     if (
    in_array("no",$b)) echo '<br><br>did not match'
     else echo 
    '<br><br>we have a match'
     
    ?>
    //
    Hok chắc sẽ giải quyết dc nhưng chắc là giúp dc tí gì đó...

    Comment


    • #3
      Chỉ có 1 cách là đọc file vào và đến dòng 6, fix rồi ghi ngược trở lại. File chỉ có cách đọc tuần tự (hoặc theo byte) chứ không có đọc theo dòng.
      Tham khảo các hàm explode và implode.

      Comment


      • #4
        Originally posted by 10520541 View Post
        Anh tham khảo những đoạn code này xem sao ...


        //
        Hok chắc sẽ giải quyết dc nhưng chắc là giúp dc tí gì đó...
        Cảm ơn em.

        Originally posted by 07520182 View Post
        Chỉ có 1 cách là đọc file vào và đến dòng 6, fix rồi ghi ngược trở lại. File chỉ có cách đọc tuần tự (hoặc theo byte) chứ không có đọc theo dòng.
        Tham khảo các hàm explode và implode.
        Anh Khương nói rõ hơn được không, hoặc cho em link tham khảo, em google đọc file trong php theo bye mà không thấy.
        Thực ra mỗi dòng của em chỉ là một số kiểu int, vì xử lí dữ liệu lớn nên dọc tuần tự tốn khá nhiều thời gian, nên em muốn đọc thẳng vào byte thứ n nào đó, như vậy sẽ tiết kiệm được khá lớn thời gian.

        Comment


        • #5
          Originally posted by 08520521 View Post
          Anh Khương nói rõ hơn được không, hoặc cho em link tham khảo, em google đọc file trong php theo bye mà không thấy.
          Thực ra mỗi dòng của em chỉ là một số kiểu int, vì xử lí dữ liệu lớn nên dọc tuần tự tốn khá nhiều thời gian, nên em muốn đọc thẳng vào byte thứ n nào đó, như vậy sẽ tiết kiệm được khá lớn thời gian.
          Đọc theo byte không giúp ích gì cho trường hợp này vì file này vốn không được biểu diễn để truy xuất ngẫu nhiên.
          Truy xuất thẳng vào byte thứ n trong file thì ngôn ngữ nào cũng hỗ trợ nhưng Vấn đề đầu tiên là với cách biểu diễn này em không thể xác định được n. Một số int được biểu diễn số bằng một chuỗi ký tự, vậy độ dài mỗi chuỗi này lại khác nhau và phân cách chỉ bằng ký tự xuống dòng, cách duy nhất xác định dòng thứ x ở byte bao nhiêu là đọc tuần tự toàn file và đếm số ký tự xuống dòng.
          Vấn đề thứ hai khi sửa một dòng, nếu như dòng đó dài hơn ban đầu vậy số byte dư ra em bỏ vào đâu bây giờ.

          Nếu kích thước dữ liệu lớn, lại cần phải truy xuất ngẫu nhiên thì ngay từ đầu em cần chọn một cách biểu diễn và lưu trữ phù hợp hơn là text file đơn giản thế này.

          Comment


          • #6
            Để đọc theo byte, tham khảo hàm fseek: http://php.net/manual/en/function.fseek.php

            Comment

            LHQC

            Collapse
            Working...
            X