首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSV行中的换行符

CSV行中的换行符
EN

Stack Overflow用户
提问于 2017-06-08 16:54:00
回答 1查看 540关注 0票数 1

我有以下csv

代码语言:javascript
复制
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如下:

代码语言:javascript
复制
    <?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为

代码语言:javascript
复制
<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进行转换。

EN

回答 1

Stack Overflow用户

发布于 2017-06-09 00:47:54

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44431055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档