【问题标题】:Export mysql table column as newline-separated values in text file将 mysql 表列导出为文本文件中的换行符分隔值
【发布时间】:2021-06-12 09:24:07
【问题描述】:

我有这个脚本可以输出到一个文本文件中:

$sql = "SELECT bodyipaddress from email_body";
$query = $dbh -> prepare($sql);
$query->execute();
$results=$query->fetchAll(PDO::FETCH_OBJ);
$cnt=1;
if($query->rowCount() > 0)
{
    foreach ($results as $result)   
    {
        $bodyipaddress       = $result->bodyipaddress;
        // create a txt file 

        $myfile      = fopen("file.txt", "a");
        $padded_text = str_pad($bodyipaddress, 0, '', STR_PAD_RIGHT);
        fwrite($myfile, $bodyipaddress);
        fclose($myfile);
                                        
        $cnt=$cnt+1; 
    }    
} 

但是通过文本文件读取的数据结果是纯文本,格式已经消失。 我是否可以使用p 垂直设置文本样式@

下面是我想为找到的每个空格垂直更改的输出。

【问题讨论】:

  • 请通过提供var_export($dbh->query("SELECT bodyipaddress FROM email_body")->fetchAll(PDO::FETCH_COLUMN));显示的数据来澄清您的问题

标签: php text styles newline fwrite


【解决方案1】:

使用输出 \r\n 或 \n 的 PHP_EOL 。 要么 fwrite($myfile, $bodyipaddress . "\n");

【讨论】:

    【解决方案2】:

    看起来您正在从整个 email_body 表中导出一组列数据,因此 IMO 最优雅/直接的方法是:

    1. 执行标准 pdo 查询 - 因为没有参数可以绑定值,所以准备好的语句是不必要的开销。
    2. 使用PDO::FETCH_COLUMN 将结果集形成一个平面数组。
    3. 因为只有创建或完全覆盖文件才有意义,所以我不推荐fopen() 上的a 模式——w 似乎更合适,这样就不会有附加数据。实际上,您甚至可能更喜欢将 file_put_contents() 作为单个函数调用而不是 fopen()fwrite(),然后是 fclose()
    4. 使用PHP_EOL 插入IP 地址的平面数组,以使换行符序列与您的系统环境(\r\n\n)对齐。
    5. 您没有在发布的脚本中使用$cnt,因此可以完全省略手动增加的计数。如果你想知道数组中有多少个ip地址,只需在结果集数组上调用count()即可。
    6. 我不明白您为什么要尝试用空格将 IP 地址右填充到零个字符的长度。

    新代码:

    file_put_contents(
        "file.txt",
        implode(
            PHP_EOL,
            $dbh->query("SELECT bodyipaddress FROM email_body")->fetchAll(PDO::FETCH_COLUMN)
        )
    );
    

    ...是的,实际上就是这么简单/简洁。


    如果您的bodyipaddress 实际上 有逗号和空格分隔的值,那么您可以用 sql 或 php 中的新行替换它们。我不知道你的表格数据到底是什么样子的。

    file_put_contents(
        "file.txt",
        str_replace(
            ', ',
            PHP_EOL,
            implode(
                PHP_EOL,
                $dbh->query("SELECT bodyipaddress FROM email_body")->fetchAll(PDO::FETCH_COLUMN)
            )
        )
    );
    

    【讨论】:

    • 嗨,我确实尝试过这段代码,但似乎即使使用 file_put_contents 也会追加数据
    • 那么您的实现中出现了错误。您的结果不是file_put_contents() 的默认行为。 php.net/manual/en/function.file-put-contents.php
    • 最好检查一下这不是对您的数据库表结果的误解。从要调试的任务中删除文件写入。 var_export($dbh->query("SELECT bodyipaddress FROM email_body")->fetchAll(PDO::FETCH_COLUMN));
    • 对于更新,我使用您的代码进行管理,但是如果想在我的代码中包含 $padded_text = str_replace(',',"\n", $bodyipaddress); $white_space = PHP_EOL . str_replace(' ', '', $padded_text); 是否有可能,因为我不想在数据库中显示原始格式
    • 我不确定我是否完全理解您要克服的挑战。你能告诉我一些 3v4l.org 演示中的麻烦文字吗?您可以在 implode() 调用周围包装其他字符串操作函数。 str_replace() 可以在implode() 调用之前或之后使用,因为它会愉快地修改一个字符串或一个字符串数组。不要使用\n,而是尝试始终使用PHP_EOL 以保持一致性。如果要删除逗号空格子字符串,请在一个操作中删除它们str_replace(', ', PHP_EOL, implode(...))
    【解决方案3】:

    我最好这样做,除了添加 PHP_EOL,将 fopen 和 fclose 移到 foreach 循环之外,因为不需要为每次迭代打开和关闭文件。

    $sql = "SELECT bodyipaddress from email_body";
    $query = $dbh -> prepare($sql);
    $query->execute();
    $results=$query->fetchAll(PDO::FETCH_OBJ);
    $cnt=1;
    if($query->rowCount() > 0)
    {
         // create a txt file outside the foreach
        $myfile      = fopen("file.txt", "a");
        foreach ($results as $result)   
        {
            $bodyipaddress       = $result->bodyipaddress;
            
            //add a new line 
            $padded_text .= PHP_EOL . str_pad($bodyipaddress, 0, '', STR_PAD_RIGHT);
            fwrite($myfile, $bodyipaddress);
                                            
            $cnt=$cnt+1; 
        }
     fclose($myfile);
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 2021-09-28
      相关资源
      最近更新 更多