2016-04-04 5 views
0

私はCSVデータに基づいてXMLファイルを書き込むために以下のXML出力機を使用しています。XML出力機が余分なアスキー文字を追加します

public override void Output(IRow input, IUnstructuredWriter output) 
    { 
     IColumn badColumn = input.Schema.FirstOrDefault(col => col.Type != typeof(string)); 
     if (badColumn != null) 
     { 
      throw new ArgumentException(string.Format("Column '{0}' must be of type 'string', not '{1}'", badColumn.Name, badColumn.Type.Name)); 
     } 

     using (var writer = XmlWriter.Create(output.BaseStream, this.fragmentSettings)) 
     { 
      writer.WriteStartElement(this.rowPath); 
      foreach (IColumn col in input.Schema) 
      { 
       var value = input.Get<string>(col.Name); 
       if (value != null) 
       { 
        // Skip null values in order to distinguish them from empty strings 
        writer.WriteElementString(this.columnPaths[col.Name] ?? col.Name, value); 
       } 
      } 
     } 
    } 

それは本当に正常に動作し、ジョブがプレビューに、しかし、エラーなしで完全に終了し、ファイルのダウンロードに読まれているxmlファイルの破損を引き起こし、他の余分な文字があります。私はフラグメントレベルとAutoを適合レベルとして試しました。得られ

私のサンプル出力は

enter image description here

とファイルの読み取り中に2つのタグの間に余分な文字が問題を引き起こしています。

+0

あなたは、データの先頭にこの文字があることを除外するために、(コードの最後の行に)書き出している間に値を調べましたか?私はあなたのプロセスでエンコーディングが変更されたと思われるかもしれませんが、通常は最初または特定の文字のために表示されます。 – montewhizdoh

+0

私はADLAでジョブを実行しているため、文字の比較を確認してチェックすることができない場合があります。あなたはエラーの詳細を知ることができる方法を知っていますか? PS。 Azureのデータ湖 –

+0

の新機能は、コードの最後の行にブレークポイントを置くことはできませんか?多分このようなものが必要でしょうか? https://blogs.msdn.microsoft.com/webdev/2013/11/04/remote-debugging-a-window-azure-web-site-with-visual-studio-2013/ – montewhizdoh

答えて

0

Iは、明示的にこれは、簡単にXMLリーダーで読み取ることができる整形XMLを出力

private XmlWriterSettings fragmentSettings = new XmlWriterSettings 
    { 
     ConformanceLevel = ConformanceLevel.Auto, 
     Encoding = Encoding.UTF8 
    }; 

public override void Output(IRow input, IUnstructuredWriter output) 
    { 
     IColumn badColumn = input.Schema.FirstOrDefault(col => col.Type != typeof(string)); 
     if (badColumn != null) 
     { 
      throw new ArgumentException(string.Format("Column '{0}' must be of type 'string', not '{1}'", badColumn.Name, badColumn.Type.Name)); 
     } 
     using (var writer = XmlWriter.Create(output.BaseStream, this.fragmentSettings)) 
     { 
      writer.WriteStartElement(this.rowPath); 
      foreach (IColumn col in input.Schema) 
      { 
       var value = input.Get<string>(col.Name); 
       if (value != null) 
       { 
        // Skip null values in order to distinguish them from empty strings 
        writer.WriteElementString(this.columnPaths[col.Name] ?? col.Name, value); 
       } 
      } 
      writer.WriteEndElement(); //explicit closing tag for stream 
     } 
    } 

以下のコードでエンコード設定ならびに終了タグを提供することにより問題を解決しました。

+1

素敵なので、エンコードしていました。それは問題が真ん中にあったので私を捨てた。 – montewhizdoh

+0

GitHubサイト(https://github.com/Azure/usql/tree/master/Examples/DataFormats)の出力例を見ましたか? –

+0

はい、私は出力例で修正を行いました。現在のgitの実装は、ファイルがGB単位である場合はタグを閉じてエンコードすることでバグが発生します。 –

関連する問題