Php 创建制表符分隔的文件

Php 创建制表符分隔的文件,php,database,Php,Database,我正在尝试创建一个以制表符分隔的文件输出,可用于加载到quickbooks中。我在上使用以下代码作为标题 header("Content-type: text/plain"); header("Content-Disposition: attachment; filename=\"my-data.txt\""); 我有两个问题 第一个是一些内容是文本,但其中有一个逗号,(这就是为什么我使用制表符分隔的.SQL(善意地)puts“”我无法理解我是如何阻止SQL这样做的,或者如何将其从文本文件的内

我正在尝试创建一个以制表符分隔的文件输出,可用于加载到quickbooks中。我在上使用以下代码作为标题

header("Content-type: text/plain");
header("Content-Disposition: attachment; filename=\"my-data.txt\"");
我有两个问题

第一个是一些内容是文本,但其中有一个逗号
(这就是为什么我使用制表符分隔的.SQL(善意地)puts“”我无法理解我是如何阻止SQL这样做的,或者如何将其从文本文件的内容中删除的

其次,脚本中的第一个输出是一个echo语句,后跟一个tab等;但是实际输出的开头包含一个额外的行(我可以看到已插入ASCII 0A),我看不出这是从哪里来的

我已经附上了我正在使用的代码,以防我遗漏了一些明显的东西

帮助

非常感谢

<?php
header("Content-type: text/plain");
header("Content-Disposition: attachment; filename=\"my-data.txt\"");
// Open standard includes 
include ('./includes/protect.php');  //User name and password control
require_once('Connections/Dragonnet.php');
mysql_select_db($database_Dragonnet, $Dragonnet);  //Connect to database
?>

<?php

$batch1 =  $_GET["batch1"];
$batch2 =  $_GET["batch2"];
$query =  "SELECT invtrans.StdInvNar1 AS 'invtrans StdInvNar1',
                  invtrans.StdInvNar2 AS 'invtrans StdInvNar2',
                  invtrans.StdInvNar3 AS 'invtrans StdInvNar3',
                  invtrans.StdInvNar4 AS 'invtrans StdInvNar4',
                  invtrans.StdInvNar5 AS 'invtrans StdInvNar5',
                  invtrans.StdInvNar6 AS 'invtrans StdInvNar6',
                  invtrans.StdInvNar7 AS 'invtrans StdInvNar7',
                  invtrans.StdInvNar8 AS 'invtrans StdInvNar8',
                  invtrans.StdInvNar9 AS 'invtrans StdInvNar9',
                  invtrans.StdInvNar10 AS 'invtrans StdInvNar10',
                  invtrans.InvNar1 AS 'invtrans InvNar1',
                  invtrans.InvNar2 AS 'invtrans InvNar2',
                  invtrans.InvNar3 AS 'invtrans InvNar3',
                  invtrans.InvNar4 AS 'invtrans InvNar4',
                  invtrans.InvNar5 AS 'invtrans InvNar5',
                  invtrans.InvNar6 AS 'invtrans InvNar6',
                  invtrans.InvNar7 AS 'invtrans InvNar7',
                  invtrans.InvNar8 AS 'invtrans InvNar8',
                  invtrans.InvNar9 AS 'invtrans InvNar9',
                  invtrans.InvNar10 AS 'invtrans InvNar10',
                  invtrans.Charge AS 'invtrans Charge',
                  invtrans.Cost AS 'invtrans Cost',
                  invtrans.VATtype AS 'invtrans VATtype',
                  invtrans.VATRate AS 'invtrans VATRate',
                  invtrans.SiteName AS 'invtrans SiteName',
                  invtrans.SiteTown AS 'invtrans SiteTown',
                  invtrans.UnitPrice AS 'invtrans UnitPrice',
                  invtrans.Type AS 'invtrans Type',
                  invtrans.InvBatch AS 'invtrans InvBatch',
                  invoiceheaders.Name AS 'invoiceheaders Name',
                  invoiceheaders.Addr1 AS 'invoiceheaders Addr1',
                  invoiceheaders.Addr2 AS 'invoiceheaders Addr2',
                  invoiceheaders.Addr3 AS 'invoiceheaders Addr3',
                  invoiceheaders.Town AS 'invoiceheaders Town',
                  invoiceheaders.County AS 'invoiceheaders County',
                  invoiceheaders.Country AS 'invoiceheaders Country',
                  invoiceheaders.PostCode AS 'invoiceheaders PostCode',
                  invoiceheaders.EMail AS 'invoiceheaders EMail',
                  invoiceheaders.Fax AS 'invoiceheaders Fax',
                  invoiceheaders.InvNo AS 'invoiceheaders InvNo',
                  invoiceheaders.InvDate AS 'invoiceheaders InvDate',
                  invoiceheaders.InvType AS 'invoiceheaders InvType',
                  invoiceheaders.DelType AS 'invoiceheaders DelType'
FROM (invtrans invtrans
     INNER JOIN invoiceheaders invoiceheaders ON (invoiceheaders.InvNo = invtrans.InvNumber ))
WHERE
(
  invtrans.InvBatch = "."'".$batch1."'"." OR invtrans.InvBatch = "."'".$batch2."'"." )
ORDER BY  invoiceheaders.InvNo

";

$result = mysql_query($query) or die(mysql_error());

//Create Headers

    echo "Customer Ref";
    echo chr(9);
    echo "Account Ref";
    echo chr(9);
    echo "TxnDate";
    echo chr(9);
    echo "Invoice No";
    echo chr(9);
    echo "BillingAddress1";
    echo chr(9);
    echo "BillingAddress2";
    echo chr(9);
    echo "BillingAddress3";
    echo chr(9);
    echo "BillingAddressTown";
    echo chr(9);
    echo "BillingAddressCounty";
    echo chr(9);
    echo "BillingAddressCountry";
    echo chr(9);
    echo "BillingAddressPostcode";
    echo chr(9);
    echo "Phone";
    echo chr(9);
    echo "Fax";
    echo chr(9);
    echo "email";
    echo chr(9);
    echo "Description";
    echo chr(9);
    echo "Rate";
    echo chr(9);
    echo "UnitOfMeasure";
    echo chr(9);
    echo "SalesTaxCode";
    echo chr(9);
    echo "Amount";
    echo chr(9);
    echo chr(13);

while($row = mysql_fetch_array($result))

  {
    //create variables
    $description = $row['invtrans StdInvNar1']." ".$row['invtrans StdInvNar2']." ".$row['invtrans StdInvNar3']." ".$row['invtrans StdInvNar4']." ".$row['invtrans StdInvNar5']." ".$row['invtrans StdInvNar6']." ".$row['invtrans StdInvNar7']." ".$row['invtrans StdInvNar8']." ".$row['invtrans StdInvNar9']." ".$row['invtrans StdInvNar10'];
    $description = $description." ".$row['invtrans InvNar1']." ".$row['invtrans InvNar2']." ".$row['invtrans InvNar3']." ".$row['invtrans InvNar4']." ".$row['invtrans InvNar5']." ".$row['invtrans InvNar6']." ".$row['invtrans InvNar7']." ".$row['invtrans InvNar8']." ".$row['invtrans InvNar9']." ".$row['invtrans InvNar10'];


    //output file
    echo $row['invoiceheaders Name'];
    echo chr(9);
    echo "Account Ref";
    echo chr(9);
    echo $row['invoiceheaders InvDate'];
    echo chr(9);
    echo $row['invoiceheaders InvNo'];
    echo chr(9);
    echo $row['invoiceheaders Addr1'];
    echo chr(9);
    echo $row['invoiceheaders Addr2'];
    echo chr(9);
    echo $row['invoiceheaders Addr3'];
    echo chr(9);
    echo $row['invoiceheaders Town'];
    echo chr(9);
    echo $row['invoiceheaders County'];
    echo chr(9);
    echo $row['invoiceheaders Country'];
    echo chr(9);
    echo $row['invoiceheaders PostCode'];
    echo chr(9);
    echo "01212331234";
    echo chr(9);
    echo $row['invoiceheaders Fax'];
    echo chr(9);
    echo $row['invoiceheaders EMail'];
    echo chr(9);
    echo $description;
    echo chr(9);
    echo $row['invtrans Charge'];
    echo chr(9);
    echo "UnitOfMeasure";
    echo chr(9);
    echo "SalesTaxCode";
    echo chr(9);
    echo $row['invtrans Charge'];
    echo chr(9);
    echo chr(13);
  }

?>

使用带有“\t”分隔符的内置函数,而不是尝试“滚动您自己的”

不同的字符集以不同的方式读取选项卡。选项卡也可以在空格(以及空格数[3/4])和选项卡之间更改,具体取决于用于创建它们的IDE


您需要选择一个不同的分隔符…我可以建议使用管道“|”,因为它在英语或HTML中没有任何地方使用,因此它可能会作为特殊字符被拾取和清除。

首先,制表符分隔的文件工作得很好。我几乎每天都使用它们。它们比逗号分隔的文件更容易使用,因为有这么多数据其中的注释(例如姓、名和街道地址)

你自己在不知不觉中插入了新行。 从这个标签
?>
到这个标签
?php
的所有内容都会被发送到浏览器。这是你的新行

至于额外的引号,请使用trim语句

echo trim($row['invtrans Charge']);

有了您概述的所有这些问题,我很惊讶这么多应用程序使用tab分隔文件这么多年,却没有人注意到,这就是为什么所有主要应用程序都不使用它。我没有提到它可能会工作,而且您可能能够找到一种方法来定期获取它,但是这并不是假设在文件创建和发送和接收的两个方面都很完美。所有主要的应用程序?Excel都将其作为导入/导出选项提供(它是导入字符分隔文件的默认字符)…这是一个相当重要的应用程序,同样是Quickbooks(否则OP将不需要它)…空格的数量仅与固定列宽文件相关,而不是以制表符或逗号分隔。使用“\t”似乎不正确。只允许使用1个字符,而技术“\t”是2个字符。据我所知,PHP并没有神奇地捕捉到这一点。因此,请改为使用chr(9)。但是,我没有针对UNICODE类型的需要对此进行测试。@Charlie No!
“\t”
是一个字符;“\`在双引号内使用时用于启动转义序列--结果是一个代表ASCII制表符的单字符OK,明白了。我验证了这个问题。我的快速测试是使用单引号(')标记,而不是双引号(“)-这确实导致了问题。在语言之间弹出有它的缺点(哈哈)-我认为PHP是我发现的唯一一种在“和”…:)之间具有不同行为的语言