将 mysql table 列导出为文本文件中的换行符分隔值

Export mysql table column as newline-separated values in text file

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

$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

来垂直设置文本样式吗

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

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

我最好这样做,除了添加 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);
} 

看起来您正在从整个 email_body table 中导出一组柱状数据,所以我认为最 elegant/direct 的方法是:

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

新代码:

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

...是的,其实就是simple/concise.


如果您的 bodyipaddress 实际上 有逗号和space 分隔值,那么您可以在 sql 或在 php。我不知道你的 table 数据到底是什么样的。

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