jjzjj

php fgetcsv 和整数转换(UTF8 x UCS-2 Little Endian)

coder 2023-12-31 原文

更新 4:

我发现(正如所怀疑的那样)文件编码是造成这种情况的原因。我将 csv 文件从 UCS-2 Little Endian 转换为 UTF-8,一切正常。无论如何,我需要找到一些方法让 PHP 正确理解输入文件。已尝试 sellocale 但没有成功。

--- 原始问题 ---

我有一些数据以“表格”格式存储在 csv 文件中,我想将这些数据存储为数据库中的 (tag, tagtimestamp, tagvalue)。但是找不到将存储在 $v 数组中的值转换为整数值的方法:

$p=0;
$tag=array();
$dt=array();
$v=array();

$handle=fopen("sga/2013.10.054.vol2.csv", "r");

while(($row=fgetcsv($handle, 0, "\t"))!==FALSE){
    $num=count($row);
    $num--; // only even collumns
    if($p==0){
        for($c=1; $c<$num; $c+=2){
            array_push($tag, $row[$c]);
        }
    }else{
        array_push($dt, $row[0]);
        for($c=1; $c<$num;$c+=2){
            array_push($v, $row[$c]); // <<< here is my problem
        }
    }
    $p++;
}
fclose($handle);

echo "<pre>";
print_r($v);
echo "</pre>";

echo :

Array(
[0] => 8701
[1] => 5281
[2] => 4341
[3] => 4360
[4] => 8701
[5] => 8239
[6] => 4631
[7] => 4115
[8] => 4123
[9] => 8239
[10] => 8409
[11] => 3978
[12] => 4192
[13] => 4216
[14] => 8409
[15] => 8916
[16] => 3325
[17] => 4444
[18] => 4472
[19] => 8916
[20] => 9550
[21] => 3286
[22] => 4763
[23] => 4789

...

尝试使用

(int)$row[$c], 
intval($row[$c]), 
($row[$c]+0), 
settype($row[$c], "integer")
preg_replace('!\s+!', $row[$c]) // to clean up any messy char...

等...

我使用以下方法插入值:

$nv=0;
$sqls="";
foreach ($tag as $kt=>$t){
    foreach($dt as $kd=>$d){
        $f=($kd*5)+$kt;
        $de=explode(" ", $d);
        $d=implode("-", array_reverse(explode("/", $de[0])))." ".$de[1];
        $nv=$v[$f]; // <<<<< here the values must become integers but only returns zeroes
        $sqls.="('$t', '$d', $nv), ";
    }
}

//最终查询设置在这里

    $sql="";
$sql="INSERT IGNORE INTO aducao (tag, tagtime, tagvalue) VALUES "; 
$sqls=rtrim($sqls, ", ");
$sql.=$sqls;
echo $sql;

我的文件是没有 BOM 格式的 UTF.8。

CSV 文件以制表符 (\t) 分隔。

无论如何,如果我保留来自 csv 的“值”,我的 mysql 数据库会抛出一个错误,如果我尝试转换这些值将变为零。

更新:

如果值没有转换,这里是 mysql 错误。我猜是因为如果我将 sql 字符串直接复制并粘贴到 mysql 查询浏览器上,则不会发生错误,因此这些值中​​存在某种类型的“污垢”...

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

更新 2:

var_dump($v) 显示:

array(3725) { [0]=> string(9) "8701" [1]=> string(9) "5281" [2]=> string(9) "4341" [3]=> string(9) "4360" [4]=> string(9) "8701" [5]=> string(9) "8239" [6]=> string(9) "4631" [7]=> string(9) "4115" [8]=> string(9) "4123" [9]=> string(9) "8239" [10]=> string(9) "8409" [11]=> string(9) "3978" [12]=> string(9) "4192" [13]=> string(9) "4216" [14]=> string(9) "8409" [15]=> string(9) "8916" [16]=> string(9) "3325" [17]=> string(9) "4444" [18]=> string(9) "4472" [19]=> string(9) "8916" [20]=> string(9) "9550" [21]=> string(9) "3286" [22]=> string(9) "4763" [23]=> string(9) "4789" [24]=> string(9) "9550" [25]=> string(11) "11506" [26]=> string(9) "3448" [27]=> string(9) "5738" [28]=> string(9) "5769" [29]=> string(11) "11506" [30]=> string(11) "11287" [31]=> string(9) "3690" [32]=> string(9) "5630" [33]=> string(9) "5656" [34]=> string(11) "11287" [35]=> string(11) "10639" [36]=> string(9) "4329" [37]=> string(9) "5312" [38]=> string(9) "5327" [39]=> string(11) "10639" [40]=> string(11) "11427" [41]=> string(9) "4973" [42]=> string(9) "5704" [43]=> string(9) "5721" [44]=> string(11) "11427" [45]=> string(11) "11688" [46]=> string(9) "5605" [47]=> string(9) "5841" [48]=> string(9) "5847" 

更新 3:

部分$sql输出

INSERT IGNORE INTO aducao (tag, tagtime, tagvalue) VALUES ('E054_VOL', '2013-10-01 00:00:00', 8701), ('E054_VOL', '2013-10-01 01:00:00', 8239), ('E054_VOL', '2013-10-01 02:00:00', 8409), ('E054_VOL', '2013-10-01 03:00:00', 8916), ('E054_VOL', '2013-10-01 04:00:00', 9550), ('E054_VOL', '2013-10-01 05:00:00', 11506), ('E054_VOL', '2013-10-01 06:00:00', 11287), ('E054_VOL', '2013-10-01 07:00:00', 10639), ('E054_VOL', '2013-10-01 08:00:00', 11427), ('E054_VOL', '2013-10-01 09:00:00', 11688), ('E054_VOL', '2013-10-01 10:00:00', 7973), ('E054_VOL', '2013-10-01 11:00:00', 2067), ('E054_VOL', '2013-10-01 12:00:00', 0), ('E054_VOL', '2013-10-01 13:00:00', 0), ('E054_VOL', '2013-10-01 14:00:00', 0), ('E054_VOL', '2013-10-01 15:00:00', 0), ('E054_VOL', '2013-10-01 16:00:00', 0), ('E054_VOL', '2013-10-01 17:00:00', 137), ('E054_VOL', '2013-10-01 18:00:00', 142), ('E054_VOL', '2013-10-01 19:00:00', 140), ('E054_VOL', '2013-10-01 20:00:00', 169), ('E054_VOL', '2013-10-01 21:00:00', 0), ('E054_VOL', '2013-10-01 22:00:00', 161), ('E054_VOL', '2013-10-01 23:00:00', 9275), ('E054_VOL', '2013-10-02 00:00:00', 7679), ('E054_VOL', '2013-10-02 01:00:00', 8996), ('E054_VOL', '2013-10-02 02:00:00', 9135), ('E054_VOL', '2013-10-02 03:00:00', 9569), ('E054_VOL', '2013-10-02 04:00:00', 10114), ('E054_VOL', '2013-10-02 05:00:00', 10612), ('E054_VOL', '2013-10-02 06:00:00', 10438), ('E054_VOL', '2013-10-02 07:00:00', 10945), ('E054_VOL', '2013-10-02 08:00:00', 11784), ('E054_VOL', '2013-10-02 09:00:00', 12355), ('E054_VOL', '2013-10-02 10:00:00', 12500), ('E054_VOL', '2013-10-02 11:00:00', 12045), ('E054_VOL', '2013-10-02 12:00:00', 12089), ('E054_VOL', '2013-10-02 13:00:00', 12413), ('E054_VOL', '2013-10-02 14:00:00', 13024), ('E054_VOL', '2013-10-02 15:00:00', 13444), ('E054_VOL', '2013-10-02 16:00:00', 12244), ('E054_VOL', '2013-10-02 17:00:00', 10139), ('E054_VOL', '2013-10-02 18:00:00', 8586), ('E054_VOL', '2013-10-02 19:00:00', 8146), ('E054_VOL', '2013-10-02 20:00:00', 8418), ('E054_VOL', '2013-10-02 21:00:00', 8857), ('E054_VOL', '2013-10-02 22:00:00', 9142), ('E054_VOL', '2013-10-02 23:00:00', 9296), ('E054_VOL', '2013-10-03 00:00:00', 10015), ('E054_VOL', '2013-10-03 01:00:00', 9256), ('E054_VOL', '2013-10-03 02:00:00', 9452), ('E054_VOL', '2013-10-03 03:00:00', 11136), ('E054_VOL', '2013-10-03 04:00:00', 110)

最佳答案

查看您的 var_dump 输出,PHP 似乎读取了一些不可打印/不可见的字符。这就是为什么您会看到 string(9) "8409",您可以清楚地看到只有 4 位数字而不是 9 位。

在你的情况下我会怎么做:

1) 了解值是否正确。

2) 使用一些十六进制查看器/编辑器并打开文件以查看实际存在的字符。

3) 解决方案之一可能只是通过简单的 preg_replace('/[^0-9]+/', '', $value); 删除所有不需要的(不可见的)字符;,然后将它们插入到 SQL 查询中。

关于php fgetcsv 和整数转换(UTF8 x UCS-2 Little Endian),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20225894/

有关php fgetcsv 和整数转换(UTF8 x UCS-2 Little Endian)的更多相关文章

  1. Ruby:模糊测试所有 unicode 字符(UTF8/编码/字符串操作) - 2

    我无法遍历整个unicode字符范围。我到处找...我正在构建一个模糊器,并希望将所有unicode字符(一次一个)嵌入到一个url中。例如:http://www.example.com?a=\uff1c我知道有一些内置工具,但我需要更多的灵active。如果我能像下面那样做:"\u"+"ff1c"那就太好了。这是我得到的最接近的:char="\u0000"...#withiniterationchar.succ!...但在字符"\u0039"之后,即数字9,我将得到"10"而不是":" 最佳答案 您可以使用pack将数字转换为UT

  2. ruby - 在我的 ramaze 应用程序上显示 £ 符号时,我收到 "incompatible character encodings: CP850 and UTF-8" - 2

    在我的ramaze应用程序上显示£符号时,我收到“不兼容的字符编码:CP850和UTF-8”。我怎样才能摆脱这个错误?我的head标签中有UTF-8元标签。当我用键盘输入£符号时会发生这种情况。看。我已将以下代码放入我的ruby​​文件中,但没有解决问题。#encoding:UTF-8Encoding.default_external='utf-8'Encoding.default_internal=Encoding::UTF_8 最佳答案 尝试强制编码以查看是否可以解决问题:your_string.force_encoding(:

  3. Ruby String.encode 仍然给出 "invalid byte sequence in UTF-8" - 2

    在IRB中,我正在尝试以下操作:1.9.3p194:001>foo="\xBF".encode("utf-8",:invalid=>:replace,:undef=>:replace)=>"\xBF"1.9.3p194:002>foo.match/foo/ArgumentError:invalidbytesequenceinUTF-8from(irb):2:in`match'知道出了什么问题吗? 最佳答案 我猜"\xBF"已经认为它是用UTF-8编码的,所以当你调用encode时,它认为你正在尝试编码一个UTF-8中的UTF-8字符

  4. ruby-on-rails - 由于 cookie 的 8 位编码(Rails 3 和 Ruby 1.9)导致错误 'incompatible character encodings: ASCII-8BIT and UTF-8' - 2

    我将一个使用1.8.7的网络应用程序移到了1.9.2,现在我一直在使用incompatiblecharacterencodings:ASCII-8BITandUTF-8我有UTF-8的数据库编码,我还有'config.encoding="utf-8"'。我看到了一些想法作为可能的解决方法并添加了Encoding.default_external=Encoding::UTF_8Encoding.default_internal=Encoding::UTF_8但是也没用。出现此错误的一段特定代码是%ul.address-@user.address.split(',').eachdo|lin

  5. ruby-on-rails - 发现未经许可的参数 : utf8, authenticity_token 仅用于更新方法 - 2

    我在用户管理Controller中有这样的更新方法defupdate@user.update(user_permitted_params)redirect_toadmin_user_managements_pathend我的强参数设置为defuser_permitted_paramsparams.require(:user).permit(:name,:email,:password,:password_confirmation,:address,:zip_code,:phone_number,:role_id)end我遇到了以下问题Unpermittedparameters:utf8

  6. 读取时出现 Ruby CSV UTF8 编码错误 - 2

    这是我在做的:csv=CSV.open(file_name,"r")我用它来测试:line=csv.shiftwhilenotline.nil?putslineline=csv.shiftend我遇到了这个:ArgumentError:invalidbytesequenceinUTF-8我读了answerhere这就是我尝试过的csv=CSV.open(file_name,"r",encoding:"windows-1251:utf-8")我遇到了以下错误:Encoding::UndefinedConversionError:"\x98"toUTF-8inconversionfromW

  7. ruby-on-rails - 使用 utf8 字符的 ruby​​ 正则表达式在 rails 中的奇怪行为 - 2

    使用非标准utf-8字符时,我的验证正则表达式之一出现问题。因此,我进行了一些实验,发现ruby​​正则表达式在rails环境或普通ruby​​中表现不同。我用中文字符串在这里发布我的实验。在ruby中“纯”:string="運動會"putsstring[/\A[\w]*\z/]=>match"運動會"-ok在rails上:#coding:utf-8task:test=>:environmentdostring="運動會"putsstring[/\A[\w]*\z/]end$raketest=>nothing-notok如果我省略#coding:utf-8,它将带有invalidmul

  8. ruby-on-rails - rails : encoding woes with serialized hashes despite UTF8 - 2

    我刚刚从ruby​​1.9.2更新到ruby​​1.9.3p0(2011-10-30修订版33570)。我的Rails应用程序使用postgresql作为其数据库后端。系统区域设置为UTF8,数据库编码也是如此。Rails应用程序的默认编码也是UTF8。我有中国用户输入汉字和英文字符。字符串存储为UTF8编码字符串。rails版本:3.0.9自更新以来,数据库中的一些现有中文字符串不再正确显示。这不会影响所有字符串,只会影响那些属于序列化哈希的字符串。存储为普通字符串的所有其他字符串看起来仍然是正确的。示例:这是一个序列化的散列,在数据库中存储为UTF8字符串:broken="---!

  9. ruby-on-rails - Ruby 2.2:PG::CharacterNotInRepertoire:错误:编码 "UTF8"的无效字节序列 - 2

    我正在升级Rails4.1应用程序以使用Ruby2.2。在升级期间,事实证明该应用程序使用了旧版本的pggem(0.12),并且gem没有使用Ruby2.2安装。所以我尝试使用更新版本的pggem(0.17.1)。现在在系统中创建新用户时有时会出现以下错误:PG::CharacterNotInRepertoire:ERROR:invalidbytesequenceforencoding"UTF8"Ruby2.2和Postgres是否存在任何已知问题?看起来应用程序配置为使用unicode:config.encoding="utf-8"在application.rb中设置,encodin

  10. Ruby on Rails 上传文件问题 奇数 utf8 转换错误 - 2

    我正在尝试上传文件,但出现以下错误:"\xFF"fromASCII-8BITtoUTF-8我非常关注Rails指南的工作。这是我正在使用的代码。file=params[:uploaded_file]File.open(Rails.root.join('public','images',file.original_filename),'w')do|f|f.write(file.read)end我不明白为什么它不起作用。我做错了什么?更新--这是应用程序跟踪app/controllers/shows_controller.rb:16:in`write'app/controllers/sho

随机推荐