由PHP和Excel生成的制表符分隔的文本文件之间的区别

我有点尴尬,我的客户需要将制表符分隔的文本文件导入到他自己的系统(FIAdmin SCS)。 不幸的是客户端和软件的支持团队都不了解PHP。 他们不断收到文件格式错误的错误。

我从DB生成这样的文件:

$fp = fopen("file.txt", "w"); foreach ($results as $key=>$res) { $put[$key][1] = "DOT"; //Third party administrator $put[$key][2] = ""; //Empty $put[$key][3] = 10030; //Dealer number $put[$key][4] = trim($res["keyfob_nr"]); //Contract number $put[$key][5] = ""; //Empty $put[$key][6] = ""; //Empty $put[$key][7] = ""; //Empty $put[$key][8] = ""; //Empty $put[$key][9] = ""; //Empty $put[$key][10] = trim($res["first_name"]); $put[$key][11] = trim($res["last_name"]); $put[$key][12] = ""; //Empty $put[$key][13] = ""; //Empty $put[$key][14] = trim($res["address"]); $put[$key][15] = trim($res["city"]); $put[$key][16] = trim($res["state"]); $put[$key][17] = trim($res["zip"]); $put[$key][18] = ""; //Empty $put[$key][19] = ""; //Empty $put[$key][20] = ""; //Empty $put[$key][21] = ""; //Empty $put[$key][22] = ""; //Empty $put[$key][23] = ""; //Empty $put[$key][24] = trim($res["vehicle_odometer"]); $put[$key][25] = ""; //Empty $put[$key][26] = ""; //Empty $put[$key][27] = ""; //Empty $put[$key][28] = ""; //Empty $put[$key][29] = trim($res["vehicle_year"]); $put[$key][30] = trim($res["vehicle_vin"]); $put[$key][31] = ""; //Empty $put[$key][32] = ""; //Empty $put[$key][33] = ""; //Empty $put[$key][34] = date("n/d/Y"); //Sale date $put[$key][35] = ""; //Empty - vehicle purchase date $put[$key][36] = ""; //Empty $put[$key][37] = ""; //Empty $put[$key][38] = ""; //Empty $put[$key][39] = ""; //Empty - auto code (only if no VIN is provided) $put[$key][40] = ""; //Lien Holder number $put[$key][41] = ""; //Empty - reinsurance ID $put[$key][42] = ""; //Empty $put[$key][43] = ""; //Empty $put[$key][44] = ""; //Empty $put[$key][45] = ""; //Empty $put[$key][46] = ""; //Empty - cancel check number $put[$key][47] = date("n/d/Y"); //Empty - vehicle in service date (only for new cars) $put[$key][48] = ""; //Empty $put[$key][49] = ""; //Empty $put[$key][50] = ""; //Empty $put[$key][51] = ""; //Empty - member id $put[$key][52] = ""; //Empty - no charge back flag $put[$key][53] = ""; //Empty - contract entry date $put[$key][54] = ""; //Empty $put[$key][55] = trim("K".substr((string)$res["amount"], 0, 1)); //Plan code. REQUIRED $put[$key][56] = 7; //Rate Book id. REQUIRED $put[$key][57] = "N"; //New or used. REQUIRED $put[$key][58] = 0; //Deductible amount. REQUIRED $put[$key][59] = 0; //Deductible type. REQUIRED $put[$key][60] = $res["term"] == 3 ? 36 : 60; //Contract Term Months. REQUIRED $put[$key][61] = 999999; //Contract Term Mileage. REQUIRED for ($i = 62; $i < 168; $i++) { if ($i == 139) { $put[$key][$i] = "SGPY"; } else { $put[$key][$i] = " "; } } fputcsv($fp, $put[$key], "\t"); //fwrite($fp, implode("\t", $put[$key])); } fclose($fp); 

当我将文件导入到Excel中时,它的外观与我给出的示例文件完全相同(示例是一个* .xlsx文件,根据它们在导出时工作)。 我已经尝试了各种方法,包括使用空格替代空string, fwrite()而不是fputcsv()\t代替chr(9)\r\nimplode()的末尾等等。 这些似乎都没有工作。

我能看到的唯一区别是文件大小。 我生成的文件都是396字节,但原来是〜254字节。 所以,我已经跑出了想法…为什么PHP生成的文件更大? 它会增加什么额外的信息,可能会毁了我的工作?

fputcsv()手册

注意:如果在读取Macintosh计算机上创build的文件或由Macintosh计算机创build文件时,PHP不能正确识别行尾,则启用auto_detect_line_endings运行时configuration选项可能有助于解决问题。

根据您运行PHP的系统来生成这些csv文件,根据input文件本身以及PHP中的这个configuration选项,您可能会得到一些不同的结果。

应该注意的是, xlsx文件不是以逗号分隔的或制表符分隔的文件。 您当然可以将CSV文件导入到Excel中,但最终由Excel来解释该导入。 这可能是一个人在Excel中导入的问题,可能与PHP无关。 这也可能是运行PHP的服务器的一个configuration问题,即生成混淆整个过程的文件。 至于罪魁祸首究竟在哪里,或者如何解决这个问题,还没有更准确的信息来说明重现问题的步骤。