php
  • file
  • csv
  • writing
  • 2017-03-27 99 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,这是我得到的: –

    相关问题