문제

CSV 파일 형태로 여러 파트너로부터 데이터를 수신하는 시스템을 설계하고 있습니다. 파일은 열의 숫자와 순서가 다를 수 있습니다. 대부분의 경우, 열의 하위 집합을 선택하고 재정렬하여 구식으로 건네주고 싶을 것입니다. 나는 파서를 가능한 한 간단하게 만들기 위해 들어오는 데이터를 일부 표준 형식으로 변환 할 수있는 것을 선호합니다.

이상적으로는 일부 그래픽 도구를 사용하여 각 들어오는 데이터 형식에 대한 변환을 생성하고 데이터베이스 또는 디스크에 문서로 변환을 저장할 수 있기를 원합니다. 데이터를 수신하면 정식 형식의 XML 문서를 얻기 위해 올바른 변환 (올바른 변환을 결정하는 방법을 신경 쓰지 마십시오)을 적용합니다. 들어오는 파일에 XML이 포함되어 있다면 각 형식에 대한 XSLT 문서를 만들었을 것입니다.

나는 과거에 비슷한 것을 위해 Biztalk의 Flat File File XSLT 확장 (또는 그들이 호출되는 것을 사용하는 것)을 사용했지만이 프로젝트에서 Biztalk의 번거 로움을 원하지 않습니다.

대체 기술 및/또는 XSLT 확장이 있는지 아는 사람이있어 우아한 방식으로 목표를 달성 할 수 있습니까?

.NET 3.5 SP1에서 C#에서 내 앱을 개발하고 있습니다 (따라서 .NET에서 지원하는 기술을 선호합니다).

도움이 되었습니까?

해결책

XSLT는 XML이 아닌 파일을 쉽게 구문 분석 할 수있는 새로운 기능을 제공합니다.

앤드류 웰치는 XSLT 2.0 CSV를 XML로 변환하는 예

다른 팁

나는 당신이 이와 같은 것이 필요하다고 생각합니다 (죄송합니다. .NET에서 지원하지 않지만 코드는 매우 간단합니다)

http://csv2xml.sourceforge.net

IIRC 누군가는 "LINQ에서 CSV"라이브러리를 만들었습니다.이 라이브러리는 변환에 입력하여 중간 XML (메모리)을 생성하는 출발점 일 수 있습니다.

그것을 발견 여기.

LINQ에서 CSV를 시도 할 수 있습니다. Microsoft의 제안이 하나 있습니다 에릭 화이트 그리고 또 다른 Matt Perdeck. 다른 사람들이 거기에 있습니다 ...

비슷한 문제 공간을 살펴볼 때 두 가지 잠재적 솔루션을 찾았습니다.

Progress Software는 도구 세트와 API (.NET)가 있습니다. Stylus Studio 도구에서 생성 된 .conv (flat ~ xml converter) 파일과 함께 사용하면 사전 정의 된 플랫 파일 형식을 실행시 XML로 변환 할 수 있습니다. 시각. 추가 정보는 여기에 있습니다 : http://www.datadirect.com/developer/data-integration/tutorials/converter-sample-code/index.ssp

또한 XFLAT라는 XML 형식이 있으며 다양한 형식, 구분, 고정 너비 등의 플랫 파일에 대한 설명을 허용 할 수 있습니다 ... XFLAT 설명을 입증 한 플랫 파일을 변환하는 Java 프로그램이 있습니다. XML로 표준 XML에서 XML XSLT 변환을 계속할 수 있습니다. 자세한 내용은 여기에서 확인할 수 있습니다. http://www.unidex.com/overview.htm

나는 실제로이 도구들 중 하나를 사용한 적이 없지만 비슷한 문제를 연구 할 때 발견했습니다.

체크 아웃 이 기사 구현시 XmlReader 이는 비 XML 입력을 처리합니다. 끔찍한 어려운 작업이 아니며 일단 작동하면 XSLT와 같은 기술을 사용할 필요가 없으므로 XSLT 만 사용할 수 있습니다.

Linux IP 경로 목록 명령에서 출력을 구문 분석합니다. 그것은 내가 주위에 누워 있던 것입니다.

'출력'이라는 요소에 Comman의 출력을 랩핑해야하며 스타일 시트가 거기에서 가져갑니다. 여기서 진정한 키는 XPath 2.0 사양의 토큰 화 명령입니다. 나는 당신이 그 전에 어떻게 할 수 있는지 모르겠습니다. 또한 이것은 단일 루트 요소를 만들지 않습니다. 당신의 경우, 대신 공간을 분할, 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>

당신은 또한 살펴볼 수 있습니다 알토바의 맵 포스

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top