1

多くのパートナーからCSVファイルの形式でデータを受信するシステムを設計しています。ファイルは、列の数と順序が異なる場合があります。ほとんどの場合、列のサブセットを選択し、それらを並べ替えて、パーサーに渡したいと思います。パーサーをできるだけ単純にするために、受信データを標準形式に変換できることを明らかに望んでいます。

理想的には、グラフィカルツールを使用して受信データ形式ごとに変換を生成し、変換をドキュメントとしてデータベースまたはディスクに保存できるようにしたいと思います。データを受信したら、正しい変換を適用して(正しい変換をどのように決定するかは気にしないでください)、正規の形式のXMLドキュメントを取得します。受信ファイルにXMLが含まれているとしたら、フォーマットごとにXSLTドキュメントを作成して、作業を進めていたでしょう。

私は過去にBizTalkのフラットファイルXSLT拡張機能(またはそれらが呼ばれるもの)を同様の目的で使用しましたが、このプロジェクトでBizTalkの煩わしさを望んでいません(そして私もそれを買う余裕はありません)。

エレガントな方法で目標を達成できる代替テクノロジーやXSLT拡張機能があるかどうか誰かが知っていますか?

.NET 3.5 SP1上のC#でアプリを開発しています(したがって、.NETでサポートされているテクノロジを優先します)。

4

8 に答える 8

1

XSLTは、非XMLファイルの解析を容易にする新機能を提供します。

Andrew Welchは、CSVをXMLに変換するXSLT2.0の例を投稿しました

于 2008-11-25T00:02:36.023 に答える
0

LINQtoCSVを試してみてください。MicrosoftのEricWhiteからの製品とMattPerdeckからの製品があります。他の人はそこにいます...

于 2009-10-06T03:31:54.097 に答える
0

このようなものが必要だと思います(申し訳ありませんが、.NETではサポートされていませんが、コードは非常に単純です)

http://csv2xml.sourceforge.net

于 2008-11-24T19:09:59.653 に答える
0

同様の問題空間を調べたところ、2 つの潜在的な解決策が見つかりました。

Progress Software には一連のツールと API (.Net) があり、Stylus Studio ツールで作成された .conv (フラットから XML へのコンバーター) ファイルと組み合わせて使用​​すると、事前定義されたフラット ファイル形式を実行時に XML に変換できます。時間。詳細はこちら: http://www.datadirect.com/developer/data-integration/tutorials/converter-sample-code/index.ssp

さらに、XFLAT と呼ばれる XML 形式があり、さまざまな形式、区切り、固定幅などでフラット ファイルを記述できます。XFLAT 記述を提供したフラット ファイルを変換する Java プログラムがあります。標準の XML から XML XSLT への変換を続行できるように、XML に変換します。詳細については、http: //www.unidex.com/overview.htmをご覧ください。

これらのツールを実際に使用したことはありませんが、同様の問題を調査しているときに見つけました。

于 2009-10-05T19:47:49.687 に答える
0

非 XML 入力を処理する の実装に関するこの記事を確認してください。XmlReaderこれはそれほど難しい作業ではなく、いったん機能するようになれば、XSLT のようなテクノロジーを使用する必要はなく、XSLT を使用するだけで済みます。

于 2009-10-07T17:32:37.983 に答える
0

これにより、linux ip route list コマンドからの出力が解析されます。それはちょうど私が横たわっていたものです。

コマンドからの出力を「output」という要素でラップする必要があり、スタイル シートはそこから取得します。ここで重要なのは、xpath 2.0 仕様の tokenize コマンドです。その前にどうやってこれを行うことができたのかわかりません。また、これは私が必要としていたものではなかったため、単一のルート要素を作成しません。あなたの場合、スペースで分割する代わりに、Id spli on a ','

<?xml version="1.0" encoding="UTF-8"?>

<xsl:output method="xml" indent="yes" />

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

<xsl:template match="//output">
    <!-- split things up for each new line -->
    <xsl:variable name="line" select="tokenize(.,'\n')"/>
    <xsl:for-each select="$line">                        
        <!-- split each line into peices based on space -->
        <xsl:variable name="split" select="tokenize(.,' +')"/>
        <xsl:if test="count($split) &gt; 1">
            <xsl:element name="route">                                        
                <xsl:for-each select="$split">
                    <xsl:choose>
                        <xsl:when test="position() = 1">
                            <xsl:attribute name="address" select="."/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:variable name="index" select="position()"/>
                            <xsl:variable name="fieldName" select="."/>
                            <xsl:if test="$fieldName and position() mod 2 = 0">
                                <xsl:attribute name="{$fieldName}" select="$split[$index + 1]"/>
                            </xsl:if>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:for-each>
            </xsl:element>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

于 2010-07-29T20:27:06.760 に答える
0

IIRC の誰かが、変換への入力として中間 XML (メモリ内) を作成するための開始点となる可能性がある "LINQ to CSV" ライブラリを作成しました。

ここで見つけました。

于 2009-02-17T14:30:32.623 に答える
-1

altova の MapForceもご覧ください。

于 2008-11-24T20:10:56.863 に答える