CSV行中的换行符

时间:2017-06-08 08:54:00

标签: regex xml csv xslt calabash

我有以下csv

DATO;JOBSID;JOBNR;TEKST;AFSENDER;MODTAGER
02-06-2017;1234;4321;"MEI KONG ML KL. 00.45-13.00 TLF. NR 1023 0188
SØNDAG ML KL 24.00-11.00 TLF. NR. 6935 0188
Prags Boulevard 49D.  Tlf. 3134 5998
Bogpakker: Tlf. 1245 0880
TILLIDSREPRÆSENTANT GRETE WISE: TLF. 21200919";"DI";"ALLE"

最初我使用换行符进行行标记化。但我的数据也包含换行符,我需要保持这些换行符。我尝试用特殊字符替换换行符,然后用换行符替换换行符。但在这种情况下,我无法进行标记化。

我的XSLT如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:f="foo/bar"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output encoding="iso-8859-1" method="xml" indent="yes"/>
    <xsl:include href="job-lib.xsl"/><!-- string normalization and other general functions in this library -->

    <!-- Parameters -->
    <xsl:param name="csv-file"/><!-- the input csv file -->
    <xsl:param name="text-encoding" as="xs:string" select="'iso-8859-1'"/>
    <xsl:param name="root-element"/><!-- root element name in output file -->

    <!-- The direct input to the transformation is an "empty" xml file with (empty) root element "null" -->
    <xsl:template match="null">
        <xsl:variable name="output-file" select="concat(substring-before($csv-file,'.csv'),'.xml')"/>
            <xsl:element name="{$root-element}">
                <xsl:variable name="csv-content">
                    <xsl:for-each select="tokenize(unparsed-text($csv-file,$text-encoding),'&#xD;')">
                        <xsl:element name="row">
                            <xsl:value-of select="."/>
                        </xsl:element>
                    </xsl:for-each>
                </xsl:variable>
                <xsl:variable name="column-names" select="tokenize(string($csv-content/row[1]),';')"/>
                <xsl:for-each select="$csv-content/row[position() &gt; 1]">
                    <xsl:copy>
                        <xsl:for-each select="tokenize(string(.),';')">
                            <xsl:variable name="column-pos" select="position()"/>
                            <xsl:variable name="element-name" select="$column-names[$column-pos]"/>
                            <xsl:element name="{$element-name}">
                                <xsl:value-of select="f:normalize(.)"/>
                            </xsl:element>
                        </xsl:for-each>
                    </xsl:copy>
                </xsl:for-each>
            </xsl:element>        
    </xsl:template>
</xsl:stylesheet>

必需的XML

<job>
  <row>
    <DATO>02-06-2017</DATO>
    <JOBSID>1234</JOBSID>
    <JOBNR>4321</JOBNR>
    <TEKST>
      "MEI KONG ML KL. 00.45-13.00 TLF. NR 1023 0188
      MEI KONG ML KL 24.00-11.00 TLF. NR. 6935 0188
      Prags Boulevard 49D.  Tlf. 3134 5998
      Bogpakker: Tlf. 1245 0880
      TILLIDSREPRÆSENTANT GRETE WISE: TLF. 21200919
    </TEKST>
    <AFSENDER>DI</AFSENDER>
    <MODTAGER>ALLE</MODTAGER>
   </row>
</job>

请帮助我,如何将我的CSV转换为包含换行符所需的XML格式。

我使用calabash进行转换。

1 个答案:

答案 0 :(得分:1)

我不清楚您的样本数据是否具有代表性。如果您的实际数据与您的示例数据完全一致,则可能会进行简单修复 - 您的MODTAGER字符串是每条记录中的最后一个数据字段,该字符串以"\n结尾。同时,您的TEKST字符串(包含换行符的唯一数据字段)从不会有一个紧跟在双引号之前的换行符 - 因此"\n永远不会匹配TEKST字符串中的任何内容。因此,您可以安全地在"\n上进行标记,以便按每条记录分解文件。