2013-11-26 12 views
10

UPDATE 4:PHPのfgetcsvと整数変換(UTF8 X UCS-2リトルエンディアン)

私はencondingファイルは、このために責任があることを(疑わとして)ことがわかりました。私はCSVファイルをUCS-2リトルエンディアンからUTF-8に変換し、すべて正常に動作します。とにかく、PHPが入力ファイルを正しく理解できるようにするには、何らかの方法を見つける必要があります。すでに成功していないsellocaleを試してみました。

---元の質問---

私は「テーブル」形式でCSVファイルに保存されているいくつかのデータを持っていると私は、データベース上で(タグ、tagtimestamp、tagvalue)として、このデータを保存します。

(int)$row[$c], 
intval($row[$c]), 
($row[$c]+0), 
settype($row[$c], "integer") 
preg_replace('!\s+!', $row[$c]) // to clean up any messy char... 
を使用しようとした...

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 

$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>"; 

エコー:しかし、整数値に$のV配列に格納された値をキャストする方法を見つけることができません

など

I

$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), "; 
    } 
} 

//を、最終的な問合せが私のファイルがフォーマットさBOMなしUTF.8あり、ここで

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

settedされています使用して値を補間します。

であり、CSVファイルはタブ(\ t)で区切られています。

とにかく私が "値"を残していれば、私のmysqlデータベースはエラーをスローし、値を変換しようとするとゼロになります。

UPDATE:値が変換されていない場合

ここではMySQLのエラーです。私はコピーして、mysqlのクエリブラウザ上で直接SQL文字列を貼り付ける場合ため、エラーが発生していないことを推測するので、「汚れ」のいくつかのタイプは、これらの値にある...

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 

UPDATE 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" 

UPDATE 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) 
+0

SQLエラーは、実際のクエリがなければあまり役に立ちません。あなたはSQLとして質問にタグを付けませんでしたが、エラーがクエリで発生している場合は、おそらくキャストする必要があります。それはあまりにも安全な場所です。 – Jasper

+0

更新された質問に対する回答:あなたのクエリはどのように見えますか? 'var_dump($ sqls);'出力(ループ外)は何ですか? –

+0

'echo $ sql'は何の出力ですか?それが私が探していたものです。正確なクエリ文字列はMySQLサーバに送られました。 – Jasper

答えて

1

ここでは、数値

PHPは、いくつかの印刷できない/見えない文字を読んでいるように見えるあなたのvar_dumpの出力を見てみると
<?php 

//call array function to walk on each element of $v array and convert it to numeric value 
array_walk($v, 'convert_to_num'); 

function convert_to_num(&$value, $key) { 

    $value = $value * 1; 


} 

var_dump($v); 

?> 
3

に$ Vのすべての値を変換する方法です。

1の値が正しいかどうかを理解して):あなたは明確にのみ4桁の数字ではなく9

は、私はあなたの状況にどうなるのかがあることを数えることができるstring(9) "8409"を参照してください理由です。

2)一部のヘキサビューア/エディタを使用してファイルを開いて、実際にどの文字が表示されているかを確認します。

3)解決策の1つは、おそらく単なるpreg_replace('/[^0-9]+/', '', $value);で不要な(不可視の)文字をすべて削除してからSQLクエリに挿入することです。

+0

こんにちは@Ingus、私はあなたの答えを授与しましたが、私はまだそれをテストしていませんでした。できるだけ早くあなたの答えを受け入れます。 ty。 –

関連する問題