PHP LOAD DATA INFILE只为特定文件插入第一行

我有一个.dat文件,我从另一个有许多逗号分隔数据行的应用程序中提取。 我用Excel打开文件,并将其保存为.csv。 我能够使用LOAD DATA INFILE将该file upload到我的数据库。

但是这里有些奇怪 如果我把原始文件复制,例如20行,并创build一个新的.csv文件,当我上传到同一个数据库,相同的表模式,它只会加载第一行。 Excel保存为新的.csv格式时,Excel是否执行了某些操作? 它看起来和我一样…用其他文本编辑器打开时看不出有什么不同。

这里是我的SQL为要导入的数据创build一个新的表(我首先检查表是否已经存在):

 // Create table - Table name matches name of file without extension $sql = "CREATE TABLE " . $file_name . " ( history_id INT, stream_id INT, record_time DATETIME, ALEQ FLOAT, APEAK FLOAT, AFASTSPL FLOAT, dose FLOAT, color INT )"; 

这是我加载.csv的SQL:

 // Insert data from uploaded .csv file into table $sql = "LOAD DATA LOCAL INFILE '" . $target_file . "' INTO TABLE " . $file_name . " FIELDS OPTIONALLY ENCLOSED BY '''' TERMINATED BY ',' LINES TERMINATED BY '\n'"; 

以下是.csv文件的工作原理:

 1,1,'2014-08-28 07:00:31',35.2,56.0,35.1,0.0000000,0 2,1,'2014-08-28 07:00:31',35.1,56.0,35.4,0.0000000,0 3,1,'2014-08-28 07:00:31',35.1,56.0,35.2,0.0000000,0 4,1,'2014-08-28 07:00:31',35.3,56.0,35.0,0.0000000,0 5,1,'2014-08-28 07:00:31',35.2,56.0,35.3,0.0000000,0 6,1,'2014-08-28 07:00:31',35.2,56.0,35.2,0.0000000,0 

这里的文件的.csv不起作用:

 60135,1,'2014-08-28 15:19:19',52,68.3,52.6,0.43186,0 60136,1,'2014-08-28 15:19:20',56.9,71.6,51.3,0.43186,0 60137,1,'2014-08-28 15:19:20',56.5,68.8,58.3,0.43186,0 60138,1,'2014-08-28 15:19:21',57,70.1,56.4,0.43186,0 60139,1,'2014-08-28 15:19:21',56.5,69.2,56.2,0.43186,0 60140,1,'2014-08-28 15:19:22',58.7,71.4,56.7,0.43186,0 

如果它只加载第一行,那么它不能正确地检测行尾。 我build议使用hex编辑器来检查你的源文件中有什么行结束。

也许你保存为“CSV(Macintosh)”,它使用\ r作为行尾。 如果是这种情况,你应该可以使用

 LINES TERMINATED BY '\r'"; 

如果你不知道行尾是一个更通用的解决scheme…

MySQL没有自动行结束检测,这就是为什么你必须告诉它如何parsing数据。 你可以使用这个简短的function做一些基本的频率分析。

 function detectLineEndings($file) { $data = file_get_contents($file); $le_linux = substr_count($data, "\n"); $le_windows = substr_count($data, "\r\n"); $le_mac = substr_count($data, "\r"); if ($le_linux > $le_windows && $le_linux > $le_mac) { return '\n'; } if ($le_mac > $le_linux && $le_mac > $le_windows) { return '\r'; } return '\r\n'; } $endings = detectLineEndings($target_file); $sql = "LOAD DATA LOCAL INFILE '" . $target_file . "' INTO TABLE " . $file_name . " FIELDS OPTIONALLY ENCLOSED BY '''' TERMINATED BY ',' LINES TERMINATED BY '" . $endings ."'";