2017-12-26 12 views
0

私はTSVファイルを取り込んで処理し、応答を出力するプロジェクトに取り組んでいます。私の友人と私はHerokuとSparkを使ってJavaベースのプログラムをWebアプリケーションに変えました。TSVファイルの処理

現在のところ、Webアプリケーションは特定の.tsvファイルのみで動作しますが、他のものは動作しません。これは、.tsvファイルの特定のエンコーディングと関連する問題です。

入力ファイルはGoogleスプレッドシートから生成された.tsvファイルですが、現在我々のプログラムは正しく解析できません。 Googleのシートに記載されているデータをコピーしてテキストファイルに貼り付けて.tsvとして保存すると、Googleのプログラムは正常に処理できます。両方のファイルが同じ正確な内容とテキスト形式を持っているが、もう一方が動作している間は動作しないので、どちらが奇妙です。

これは、ボタンがクリックされたときに呼び出され、私のsendData()JS関数である:それはでとるとJavaによる要求を読み込むのはここ

function sendData() { 
     var fr = new FileReader(); 
     fr.onload = function(event) { 
      var result = event.target.result; 
      $.post("/rides", result, function(result, error) { 
       result = result.replace(/\n/g, "<br>"); 
       $(".result").html(result); 
      }); 
     }; 
     var rides = $("#rides"); 
     var files = rides[0]['files']; 
     var file = files[0]; 
     fr.readAsText(file, 'ASCII'); 
    } 

は次のとおりです。

public static void main(String[] args) 
{ 
    port(getHerokuAssignedPort()); 
    staticFileLocation("/public"); 
    get("/ping", (req, res) -> "pong"); 
    post("/rides", (req, res) -> { 
     System.out.println("parsing..."); 
     final RawParticipants participants = parser.parseInitialRequest(req.body()); 
     final AssignedRides result = orchestrator.orchestrateRides(participants); 
     System.out.println(participants); 
     return result.toString(); 
    }); 
} 

出力さまざまな.tsvファイルによって異なりますが、Googleスプレッドシートからダウンロードしたファイルはすべて正しく解析されません。 Googleのプログラムでファイル内の内容をGoogleスプレッドシートから読み取ることができないか、一部の行を読み取ることができますが、他の行は読み取れません。私の中には、データについて特別なものは何もありません。単純なプレーンテキストはタブで区切られています。 Googleシートが.tsvファイルをどのようにエンコードしているかを調べましたが、コピー/ペーストから作成された.tsvファイルと同じASCIIエンコードだけでは特別なものではありません。だから私はこの問題を解決する方法についてちょっとだけ困っています。特に、正確に同じ情報で.tsvファイルを入力して、別の方法で生成し、プログラムが正常に読み込めるようにしてください。

誰かが特定の.tsvファイルを処理できない理由を知っていますが、その解決策は何ですか?ありがとう!私は、必要に応じてより多くの情報を提供したいと思っています。

+0

あなたは 'req.body()'の代わりに 'new String(req.bodyAsBytes()、StandardCharsets.UTF_8)'のようなものを試しましたか? – codefinger

+0

問題はローカルで発生するか、またはHerokuでのみ発生しますか。 – codefinger

+0

@codefingerあなたの提案を試してみました。悲しいことに、うまくいきませんでした。アプリはまだGoogleスプレッドシートで生成された.tsvファイルを正しく解析できません。あなたの2番目の質問に関して、私はあなたが何を意味しているかは完全には分かっていませんが、何かがあれば、問題がHerokuにあるとは思わないのです。どういうわけか私のプログラムはエンコードのために特定の.tsvファイルを読むことができません。パーサが正しく動作していることを確認するために単体テストを作成し、タブで区切られたテキストを正常に解析します。しかし、Sheetsから.tsvファイルが見つかると、それはちょっとしたことになります。 – Aaron

答えて

0

私はこの問題に悩まされていましたが、問題を解決できました。 .tsvファイルの解析が正常に行われなかったのは、GoogleスプレッドシートがWebサイトからダウンロードする際に生成されたCRLF行ターミネータによるものです。これは何らかの形でエンコーディングエラーですが、詳細なファイル編集で解決する必要はありません。私がする必要があったのは、 "/ r/n"を通常の "/ n"に置き換えて、.tsvファイルの新しい行を示すことでした。これらの行ターミネータは、各行の最後に置かれ、ファイルの適切な読み方が混乱していました。したがって、これを修正するために、私は使用する改行のデフォルトの表記で置き換える必要がありました: "/ n"。 Voila!一定。