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 ."'";