2013-07-15 48 views
-3

我告诉你这个函数“fputcsv”是越野车! 我为什么这么说? 我创建了一个CSV文件说,4号线PHP csv函数fputcsv

l1data1;l1data2;l1data3;l1data4 
l2data1;l2data2;l2data3;l2data4 
l3data1;l3data2;l3data3;l3data4 
l4data1;l4data2;l4data3;l4data4 

确定现在我简单的复制该文件到另一个文件中使用fgetcsv和fputcsv像下面这样:

$handle = fopen($nameFile, "r") or die("Cannot open file: ".$nameFile); 
$temporaryFile = fopen($nameTempFile, "w") or die("Cannot open file: ".$nameTempFile); 
while (($data = fgetcsv($handle,"", ";")) !== false) { 
    fputcsv($temporaryFile, $data,";"); 
} 
fclose($temporaryFile); 
fclose($handle); 

输出文件:

l1data1;l1data2;l1data3;l1data4 
l2data1;l2data2;"l2data3";l2data4 
l3data1;l3data2;"l3data3";l3data4 
l4data1;l4data2;"l4data3";l4data4 

由于某些原因,我的第三列中没有明显的原因,因此会出现双引号。

现在我有一些旧的方式做到这一点:

while ($data=fgets($handle)){ 
    fputs($temporaryFile, $data); 
} 

输出类似预期:

l1data1;l1data2;l1data3;l1data4 
l2data1;l2data2;l2data3;l2data4 
l3data1;l3data2;l3data3;l3data4 
l4data1;l4data2;l4data3;l4data4 

解释这个!

编辑:

CodeOffreArtemis;CodeOffre42C;CodeOffreSagic;ServiceType;Rate;TypeInterface;Techno;Libelles;CodeOffreCristal 
G8R1_ACAB;ABE;;ACA;18;Eth;A;ACo Max2;test 
G8R1_ACAC;ABE;ACABUS;ACA;18;Eth;A;ACo 20MMax; 
G8R1_ACAD;AKE;ACAD;ACA;2MMAX;Eth;A;ACo 2MMax; 
G8R1_ACANBA;WAB;;ACA;18;Eth;A;DSL Access Max2 ACA Nu ligne active;X201 
G8R1_ACANBC;WAB;;ACA;18;Eth;A;DSL Access Max2 ACA Nu sur pré-câblée;X201 
G8R1_ACANBI;WAB;;ACA;18;Eth;A;DSL Access Max2 ACA Nu ligne inactive;X201 
G8R1_ACANBPORA;QAB;;ACA;18;Eth;A;DSL Access Max2 ACA Nu avec portabilité L active;X201 
G8R1_ACANBR;WAB;;ACA;18;Eth;A;DSL Access Max2 ACA Nu Nd de routage;X201 
G8R1_ACANCA;WAB;ACANB;ACA;18;Eth;A;DSL Access 20MMax ACA Nu ligne active;X201 

第一行是标题其余的数据。

+0

双引号值在标准中,不应导致任何问题。这是奇怪的,但它为什么会这样做... –

+0

输出文件1的第一行是否缺少双引号,或者是一个错字? –

+0

我无法复制所得到的结果(使用PHP 5.3.24) - 尝试使用'var_dump'输出您正在从文件中读取的字符,也许? – andrewsi

回答

0
fgetcsv($handle,"", ";"); 

看这里: http://www.php.net/manual/en/function.fgetcsv.php

array fgetcsv (resource $handle [, int $length = 0 [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\\' ]]]]) 

关于该长度参数:

必须大于最长行更大的(以字符)在CSV文件中找到(允许尾行尾字符)。它在PHP 5中成为可选项。省略此参数(或者在PHP 5.0.4及更高版本中将其设置为0),最大行长度不受限制,这稍微慢一些。

我无法确定,但它看起来像你只是省略了句柄,根据版本可能是合法的,但似乎也可能是模棱两可的?尝试在那里添加一个0参数?

+0

我把它放在1000上了,我仍然得到了相同的结果 – Joseph

+0

好的,这些参数对我来说虽然没有意义。是“”应该是你的长度参数?或者它是分隔符和“;”外壳?它看起来像错误的顺序。我想知道这是否会导致一些奇怪的行为,因为它被解释的方式。 另外,你使用的是什么版本的PHP和操作系统?在5.4.x之前有一个magic_quotes_runtime变量可以影响fputcsv(),即使使用引号字符进行转义取决于配置。令人怀疑的是这个问题,但如果没有其他的工作... –

+0

Andrewsi给了我所有我需要的信息,这是fputcsv它的缺陷,只要你有空间,它会自动添加双引号。它不应该。 – Joseph