php
  • file
  • csv
  • writing
  • 2017-03-27 80 views 0 likes 
    0

    我有一個問題。我試圖從數據庫中獲取一些數據到.csv表中。用php寫入csv問題

    $fn=fopen($path.$filename, "w"); 
    
    $addstring = file_get_contents($path.$filename); 
    
    $addstring = 'Azonosito;Datum;Ido;Leiras;IP-cim;allomasnév;MAC-cim;Felhasznalonev;Tranzakcioazonosito;Lekerdezes eredmenye;Vizsgalat ideje;Korrelacios azonosito;DHCID;'; 
    /*$addstring .= "\n";*/ 
    
    $sql="select * from dhcpertekeles.dhcpk"; 
    $result =mysqli_query($conn, $sql); 
    
    if ($result=mysqli_query($conn,$sql)) 
        { 
        while ($row=mysqli_fetch_row($result)) 
        { 
    
        $addstring .= "\n".$row[0].";".$row[1].";".$row[2].";".$row[3].";".$row[4].";".$row[5].";".$row[6].";".$row[7].";".$row[8].";".$row[9].";".$row[10].";".$row[11].";".$row[12].";"; 
    
    }; 
    }; 
    
        /*file_put_contents($path.$filename, $addstring);*/ 
    
        fwrite($fn, $addstring); 
        fclose($fn); 
    

    的數據是以下格式: 第一個addstring包含列名,並且沒有問題

    第二(addstring =。)中包含的數據: ID($行[0 ],Date($ row [1]),Time($ row [2]),Description($ row [3]),IP($ row [4]),計算機名稱($ row [5]),MAC ($ row [6]),User($ row [7])(空),Transactionid($ row [8]),查詢結果($ row [9]),查詢時間($ row [10] ($ row [11])(空),DHCID($ row [12])(空)

    它基本上是每天上傳到數據庫的DHCP服務器數據。現在,代碼起作用了,它將我想要的所有東西寫入csv,但有兩個問題。

    1,某些不可解釋的原因代碼,在包含數據的行之間的csv表中插入一個空行。刪除$ row [12]解決了這個問題。我嘗試刪除特殊字符,將空格轉換爲可以看到的東西,甚至將空字符串轉換爲可以看到的東西。然而,沒有任何實際工作,我什至嘗試file_puts_content(第二個問題相同),而不是fwrite,但沒有。同樣的事情不斷髮生。如果我刪除\ n它將起作用,但第二行將向右錯位1列。

    2,由於某種原因,最後2個字符被從csv中刪除。在將其寫入文件之前,要插入到csv中的字符串仍包含上述2個字符。嘗試了fwrite和file_puts_content。

    至於.csv格式,數據列被除以;和\ n的行。

    也試着用libre office和excel閱讀這個文件,認爲它可能是揮之不去的excel。

    +2

    在寫入csv時更好地使用fputcsv。這是建議的方式,並會照顧一些骯髒的工作。 – marmeladze

    回答

    1

    嘗試使用fputcsv()函數。我沒有測試下面的代碼,但我認爲它應該可以工作。

    $file = fopen($path . $filename, 'w'); 
    
    $header = array(
        'Azonosito', 
        'Datum', 
        'Ido', 
        'Leiras', 
        'IP-cim', 
        'allomasnév', 
        'MAC-cim', 
        'Felhasznalonev', 
        'Tranzakcioazonosito', 
        'Lekerdezes eredmenye', 
        'Vizsgalat ideje', 
        'Korrelacios azonosito', 
        'DHCID' 
    ); 
    
    fputcsv($file, $header, ';'); 
    
    $sql = "select * from dhcpertekeles.dhcpk"; 
    $result = mysqli_query($conn, $sql); 
    
    if ($result = mysqli_query($conn, $sql)) { 
        while ($row = mysqli_fetch_row($result)) { 
         fputcsv($file, $row, ';'); 
        } 
    } 
    
    fclose($file); 
    
    +0

    謝謝!你的解決方案和下面的人都工作。我對此感到頭疼。現在,空行不見了,但我仍然缺少字符串中的2個字符,直到寫入命令發出。另外,我的數據庫在utf-8中,utf-8中沒有bom的文件,代碼是utf-8,也在頭文件中定義。 –

    0

    $addstring = file_get_contents($path.$filename)不會執行任何操作,因爲您在下一行覆蓋該變量。

    刪除多餘的列12沒有你試圖消除\ n 的\ r的東西,如:

    $row[12] = strtr($row[12], array("\n"=>'', "\r"=>''));

    您還可以檢查ASCII字符你$行[12]與此功能拍攝形式接收PHP的網站,其中:

    function AsciiToInt($char){ 
    $success = ""; 
        if(strlen($char) == 1) 
         return "char(".ord($char).")"; 
        else{ 
         for($i = 0; $i < strlen($char); $i++){ 
          if($i == strlen($char) - 1) 
           $success = $success.ord($char[$i]); 
          else 
           $success = $success.ord($char[$i]).","; 
         } 
         return "char(".$success.")"; 
        } 
    } 
    

    另一個技巧可它返回UTF-8或UTF數據庫-16,你在文本文件中丟失了一些字符。

    請嘗試使用mb_detect_encoding函數來查看。

    +0

    謝謝!你的解決方案和上面的人都工作,而且我的數據庫的確在utf-8中,文件在utf-8中沒有bom,並且代碼也使用了標題中定義的utf-8。你能告訴我更多關於這可能導致人物損失的情況嗎?因爲我最後還是錯過了2個角色?謝謝。 –

    +0

    其他代碼修復了12段的換行符?使用我發佈的AsciiToInt函數檢查字段12,以查看它具有哪些特殊字符。測試還可以使用Notepad ++之類的一個UTF-8編輯器打開CSV文件,以查看是否顯示字符。並告訴我們你怎麼知道你在文件中缺少兩個字符。你有數字嗎?注意\ r和\ n算作角色。 – NetVicious

    +0

    我可以看到缺少的字符,因爲我手動填寫了每個字段的所有字段,我給了一個數字,最後一個字段缺少整個雙位數字,至於我如何知道它的2個字符,這是因爲一開始我添加了\ n字符在行[12]然後從數字12 1仍然在那裏,但是2在我刪除\ n字符後消失了,整個數字12消失了。另外我在將它寫入文件之前打印了整個字符串,並且它具有字符,但是一旦它們在csv中,它們就會丟失。用np ++檢查csv,這是我得到的: –

    相關問題