java 读取csv 逗号分隔_从csv文件读取时,fgetcsv没有正确拆分逗号

我正在尝试解析CSV数据,但在csv以逗号分隔时挣扎 .

函数 fgetcsv() 也在十进制数字上拆分逗号,即使这些字段是封闭的 .

当从所述csv文件手动复制行并将其用作变量以使用 str_getcsv() 解析它时,它工作正常 .

我对其他分隔符没有问题,例如制表符或分号只有逗号 .

例如:

$csv_string = '"OUT30045","stuk","16,70","1","1","5,00","0,0400","16,03","10,00","0,0750","15,45"';

print_r(str_getcsv($csv_string));

输出:

Array

(

[0] => OUT30045

[1] => stuk

[2] => 16,70

[3] => 1

[4] => 1

[5] => 5,00

[6] => 0,0400

[7] => 16,03

[8] => 10,00

[9] => 0,0750

[10] => 15,45

)

这就是我想要的以及应该如何 .

但是当我尝试直接从CSV文件中读取相同的上述信息时,它也会分割十进制值:

$csv_file = "PriceList_ART_comma.csv";

$file = new SplFileObject($csv_file, "r");

$fields = $file->fgetcsv();

print_r($fields);

输出:

Array(

[0] => "OUT30045"

[1] => "stuk"

[2] => "16

[3] => 70"

[4] => "1"

[5] => "1"

[6] => "5

[7] => 00"

[8] => "0

[9] => 0400"

[10] => "16

[11] => 03"

[12] => "10

[13] => 00"

[14] => "0

[15] => 0750"

[16] => "15

[17] => 45"

)

由于我无法控制用户是否上传逗号,制表符或分号分隔文件,我必须让它用于逗号分隔文件 .

任何帮助将不胜感激 .

CSV文件的示例:

"ItemCode","Unit","Price","UnitFactor","EntryMethod","Aantal1","Korting1","Nieuwe prijs1","Aantal2","Korting2","Nieuwe prijs2"

"IND300654","stuk","37,99","1","1",,,,,,

"IND300655","stuk","23,95","1","1",,,,,,

"IND300656","stuk","23,95","1","1",,,,,,

"IND300657","stuk","24,25","1","1",,,,,,

"OUT30045","stuk","16,70","1","1","5,00","0,0400","16,03","10,00","0,0750","15,45"

"OUT30055","stuk","39,20","1","1","5,00","0,0400","37,63",,,

"OUT30073","stuk","45,00","1","1","5,00","0,0400","43,20",,,

"OUT30074","stuk","45,00","1","1","5,00","0,0400","43,20",,,

编辑:

我认为它可能与文件本身有关 . 我复制了CSV文件的内容并粘贴在记事本中并将其保存为.csv文件 . 当我使用这个新文件时,它一切正常......不知何故原始的CSV文件无法正确读取,可能是因为某种编码?

编辑解决:

找到了我的问题的原因 . 原始CSV文件在每个字符后面包含一些NULL字符(chr(0)) . 因此解析例如“ItemCode”结果类似于“0I0t0e0m0c0o0d0e . 在每行上执行str_replace(chr(0),”“,$ string)后,str_getcsv()正常工作 .

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值