如何通过impex从CSV数据导入带有半冒号的值

2020-09-13 23:16发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我们正尝试通过热文件夹映射导入CSV数据,但是当数据包含半冒号时,它会为少量记录生成不正确的Impex,因此由于映射中发生不匹配而失败,因为半冒号被视为列 根据impex systax分隔。

示例:下面的CSV记录按照impex标头映射到4列,第3列数据包含半冒号,因此生成的impex考虑为2个不同的值条目(" MR"和" Hybris"),但应视为简单 值输入。

" 123" |" ABC" | " MR; Hybris" |" experts.hybris。 com " |

有什么解决方案/建议吗?

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我们正尝试通过热文件夹映射导入CSV数据,但是当数据包含半冒号时,它会为少量记录生成不正确的Impex,因此由于映射中发生不匹配而失败,因为半冒号被视为列 根据impex systax分隔。

示例:下面的CSV记录按照impex标头映射到4列,第3列数据包含半冒号,因此生成的impex考虑为2个不同的值条目(" MR"和" Hybris"),但应视为简单 值输入。

" 123" |" ABC" | " MR; Hybris" |" experts.hybris。 com " |

有什么解决方案/建议吗?

付费偷看设置
发送
1条回答
南山jay
1楼-- · 2020-09-14 00:18

你好。

首先,在hot-folder-spring.xml中检查ImpexTransformerTask的fieldSeparator是否设置为与分号不同的值。 这是我正在谈论的代码片段:

  ...
  
          
          
          
          
      
  ...

  

但这还不够,因为OOTB转换器的escapeQuotes方法中的OOTB转换器de.hybris.platform.acceleratorservices.dataimport.batch.converter.impl.DefaultImpexConverter会以分号作为标记来分割字符串。 因此,如果数据中有分号,则整个impex会失真。

有两种处理方法:

  1. 再次为csv和impex插入封闭字符多余的双引号:

    "" MR; 杂种""

  2. 另一种方法是更改​​DefaultImpexConverter,以便它以不同的方式拆分字符串。 这样做的方法如下:

    复制现有的DefaultImpexConverter,将其重命名(例如,TestingImpexConverter),然后将其粘贴到某处。

检查名为convert(...)的覆盖方法在中间附近,有一个代码段,如下所示:

 字符串colValue = row.get(mapIdx);
 //mapIdx是您的csv文件中的列号

  

进行调试时,您会发现colValue是数据的Impex版本,但没有所需的封闭字符。 如果要使用封闭字符而不更改csv文件,则最好进行一些处理,然后将如下所示的代码段用于测试目的。

 //仅对特定列中的数据执行此操作。  (此示例的第三列)
  如果(mapIdx.intValue()== 2){
   //用于测试
   //手动放置双引号以包含字符
    colValue =" \"" + colValue +" \"";
  }

  

更新您的映射:

  
        
        ...

  

无论您从上面使用哪种方法,最后一步都是覆盖escapeQuotes方法,以使我们了解我们使用双引号作为封闭字符:

  @Override
  受保护的String escapeQuotes(最终字符串输入)
  {
     //最后的String [] splitedInput = StringUtils.splitPreserveAllTokens(input,SEMICOLON_CHAR);
     //从Apache通用包使用StrTokenizer
     //使用分号作为定界符,并使用双引号将数据括起来
      final String [] splitInput = new StrTokenizer(input,';','"').getTokenArray();
 
      最终List  tmp = new ArrayList ();
      为(最终字符串字符串:splitedInput)
      {
          如果(doesNotContainNewLine(string))
          {
              tmp.add(StringEscapeUtils.escapeCsv(string));
          }
          其他
          {
              tmp.add(string);
          }
      }
      返回StringUtils.join(tmp,SEMICOLON_CHAR);
  }

  

希望有帮助,

一周热门 更多>