2016-08-30 2 views
2

私のクライアントがタブ区切りテキストファイルを自分のシステム(FIAdmin SCS)にインポートする必要があるピックルのようなものです。残念ながら、クライアントやソフトウェアのサポートチームはPHPについて何も知らない。彼らは、ファイルが間違った形式のエラーを取得し続けます。PHPとExcelで生成されたタブ区切りテキストファイルの相違

私はこのような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のですファイル、エクスポート時に動作します)。私はfputcsv()\tの代わりにchr(9)\r\nimplode()の代わりに空白文字列、fwrite()の代わりにスペースを使用するなど、さまざまな方法を試しました。これらのどれも動作していないようです。

唯一の違いはファイルサイズです。生成されるファイルはすべて396バイトですが、元のファイルは〜254バイトです。だから私はアイデアがなくなったように...なぜPHPはファイルを大きく生成されますか?それは私の仕事を台無しにするかもしれない何が追加情報ですか?

+2

提案:「16進表示」をサポートするテキストエディタをお探しください。私の推測では、PHPがLinuxサーバー上で生成されている可能性があります...(Windows CR/LFの代わりに)改行を持つ可能性があります。これは、Excelの混乱を混乱させる可能性があります。 – paulsm4

+0

@ palsm4、私はここで何を正確に見ていますか? [オリジナルファイル](https://postimg.org/image/5598ksa8x/)は実際に[生成されたファイル](https://postimg.org/image/bufs0svkx/)よりかなり短く見えます。それは右/作業 "タブ"は0x0909としてマークされているようだが、PHPは0x0920としてそれを生成します。しかし、再び、ファイルの始めに、PHPはタブを正しく生成しますか? – jeesus

+0

@ paulsm4あなたは正しいです。 16進コードをチェックした後、私は問題を解決したと思う。行末とタブが正しく生成されませんでした。ありがとう! – jeesus

答えて

0

From the manual on fputcsv()

注:マッキントッシュコンピュータ上で作成されたファイルを読み込む際に、PHPが行末を認識されていない場合は、auto_detect_line_endings実行時の設定オプションを有効にすると、問題を解決できる場合があります。

これらのcsvファイルを生成するためにPHPを実行しているシステムに応じて、入力ファイル自体とPHPのこの設定オプションに応じて、さまざまな結果が得られます。

xlsxファイルはカンマ区切りまたはタブ区切りのファイルではありません。あなたは確かにCSVファイルをExcelにインポートすることができるかもしれませんが、最終的にはそのインポートをどのように解釈するかExcelに任されます。これは、Excelでのインポートを行う人には問題であり、PHPとは何の関係もない可能性があります。また、PHPを実行しているプロセスが全体のプロセスを狂わせるようなファイルを生成している場合の設定上の問題かもしれません。犯人がどこにいるのか、問題を再現するステップについてより正確な情報がなくても、それを修正する方法は正確には不明なままです。

関連する問題