teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

ソースコード更新

2015/04/10 01:05

投稿

hermitagejp
hermitagejp

スコア53

answer CHANGED
@@ -2,16 +2,19 @@
2
2
 
3
3
  ```lang-php
4
4
  <?php
5
- function trim_zero($v) {
5
+ function formatting_to_sql($v) {
6
+ //空白文字を除去
7
+ $v = trim($v);
8
+
6
9
  if( preg_match('/[^\d]/',$v) ){
7
- //数字以外の文字を含む場合はそのまま返す
10
+ //数字以外の文字を含む場合はテキストとして判別して文字コードを変えて返す
8
- return $v;
11
+ return mb_convert_encoding($v, "UTF-8", "SJIS");
9
12
  }
10
13
  if( preg_match('/^0+$/',$v) ){
11
14
  //テキストが全部0だったら0にして返す
12
15
  return 0;
13
16
  } else {
14
- //テキスト0以外の数字があったら先頭の0を省いて返す
17
+ //テキストが数字で0以外の数字があったら先頭の0を省いて返す
15
18
  return intval(preg_replace('/^0*([1-9][0-9]*)$/','$1',$v,1));
16
19
  }
17
20
  }
@@ -20,21 +23,34 @@
20
23
  $fp = fopen('sample.csv','r');
21
24
 
22
25
  //一行ずつCSVからデータを取り出しつつループ
26
+ $i = 0;
23
27
  while( $line = fgetcsv($fp) ){
28
+ //ヘッダ行からセル名を記憶する
29
+ if( $i == 0){
30
+ $cell_sql = array();
31
+ foreach( $line as $v ){
32
+ $cell_sql[] = sprintf("%s",$v);
33
+ }
34
+ } else {
35
+ //一行ずつ取り出したCSVの各セルをトリム関数を使ってSQL用に成形
24
- $line_sql = array();
36
+ $line_sql = array();
25
-
26
- //一行ずつ取り出したCSVの各セルをトリム関数を使ってSQL用に成形
27
- foreach( $line as $k => $v){
37
+ foreach( $line as $v){
28
- $line_sql[] = sprintf("'%s'",trim_zero($v));
38
+ $line_sql[] = sprintf("'%s'",formatting_to_sql($v));
39
+ }
40
+ //まとめたセルをはき出してSQLを成形
41
+ $sql = sprintf(
42
+ 'INSERT INTO table (%s) values (%s);'
43
+ ,mysql_real_escape_string(implode(',',$cell_sql))
44
+ ,mysql_real_escape_string(implode(',',$line_sql))
45
+ );
46
+
47
+ //SQL実行
48
+ //...
29
49
  }
30
- //まとめたセルをはき出してSQLを成形
50
+ //ループカウンタインクリメント
31
- $sql = sprintf('INSERT INTO table values (%s);',implode(',',$line_sql));
32
-
33
- //SQL実行
34
- //...
51
+ $i++;
35
52
  }
36
53
 
37
54
  //ファイルを閉じる
38
55
  fclose($fp);
39
-
40
56
  ```