Разница между текстовым файлом с разделителями табуляции, сгенерированным PHP и Excel

Я как бы в рассоле, когда моему клиенту нужно импортировать текстовый файл с разделителями табуляции в свою собственную систему (FIAdmin SCS). К сожалению, ни клиент, ни служба поддержки программного обеспечения ничего не знают о PHP. Они продолжают получать ошибки, что файл имеет неправильный формат.

Я создаю файлы из БД следующим образом:

    $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, который, по их словам, работает при экспорте). Я пробовал разные способы, включая использование пробелов вместо пустых строк, fwrite() вместо fputcsv(), \t вместо chr(9), \r\n в конце implode() и так далее. Ни один из них не работает.

Единственная разница, которую я вижу, это размер файла. Все мои сгенерированные файлы имеют размер 396 байт, а исходные - ~ 254 байта. Так как у меня закончились идеи... почему сгенерированный PHP файл больше? Какую дополнительную информацию он добавляет, что может испортить мою работу?


person jeesus    schedule 30.08.2016    source источник
comment
ПРЕДЛОЖЕНИЕ: найдите себе текстовый редактор, поддерживающий шестнадцатеричный вид. Я предполагаю, что PHP может быть сгенерирован на сервере Linux ... и может иметь новую строку (вместо Windows CR / LF) ... что может запутать Excel.   -  person paulsm4    schedule 30.08.2016
comment
@palsm4, что именно я здесь ищу? исходный файл действительно кажется намного короче, чем сгенерированный файл. Кажется, правые/рабочие вкладки помечены как 0x0909, но PHP генерирует их как 0x0920. Но опять же, в начале файла PHP корректно формирует вкладки?!   -  person jeesus    schedule 30.08.2016
comment
@ paulsm4 ты был прав. После проверки шестнадцатеричного кода я думаю, что решил проблему. Окончания строк и табуляции не были сгенерированы должным образом. Спасибо!   -  person jeesus    schedule 30.08.2016


Ответы (1)


Из руководства по fputcsv()

Примечание. Если PHP неправильно распознает окончания строк при чтении файлов на компьютере Macintosh или созданных им, включение auto_detect_line_endings может помочь решить проблему.

В зависимости от того, в какой системе вы используете PHP для создания этих CSV-файлов, а также в зависимости от самого входного файла и этого параметра конфигурации в PHP, вы можете получить разные результаты.

Следует отметить, что файлы xlsx не являются файлами, разделенными запятыми или символами табуляции. Вы, безусловно, можете импортировать файлы CSV в Excel, но в конечном итоге Excel должен интерпретировать этот импорт. Это может быть проблема с человеком, выполняющим импорт в Excel, и может не иметь ничего общего с PHP. Это также может быть проблема с конфигурацией сервера, на котором работает PHP, который создает файлы, которые запутывают весь процесс. Остается неясным, где именно находится виновник или как его исправить, без более точной информации о шагах, которые воспроизводят проблему.

person Sherif    schedule 30.08.2016