【问题标题】:How to get rid of enter in String如何摆脱输入字符串
【发布时间】:2018-10-08 10:47:18
【问题描述】:

当我尝试对我的字符串执行一些操作时,我的 tMap 出现问题。我有一个具有 Ad_Set_Name 的 csv,在某些行中单元格中有更多行。我使用以下内容:

row4.Ad_Set_Name.contains(" ") ? row4.Ad_Set_Name.substring(0,row4.Ad_Set_Name.indexOf(" ")) : row4.Ad_Set_Name
row4.Ad_Set_Name.contains("\"") ? row4.Ad_Set_Name.substring(row4.Ad_Set_Name.indexOf("\"")+1,row4.Ad_Set_Name.lastIndexOf("\"")) : "null"

我假设 Ad_Set_Name “Other vc_7days”。所以在这种情况下,第一行会给我“Other”,第二行会给我“null”。 Ad_Set_Name = "Other vc_7days "something" 3rd" 第一行将返回 "Other",第二行将返回 "something"。但是当我有 Ad_Set_Name=

“其他”

东西” 我有一个索引错误,例如:“StringIndexOutOfBoundsException:字符串索引超出范围:-1” 知道为什么吗? 非常感谢!

错误日志是:

Exception in component tMap_1 (facebook_campaigns_amazon_us)
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(Unknown Source)
    at mava2.facebook_campaigns_amazon_us_0_1.facebook_campaigns_amazon_us.tFileInputDelimited_2Process(facebook_campaigns_amazon_us.java:4649)
    at mava2.facebook_campaigns_amazon_us_0_1.facebook_campaigns_amazon_us.tWaitForFile_1Process(facebook_campaigns_amazon_us.java:2322)
    at mava2.facebook_campaigns_amazon_us_0_1.facebook_campaigns_amazon_us.tMysqlConnection_1Process(facebook_campaigns_amazon_us.java:856)
    at mava2.facebook_campaigns_amazon_us_0_1.facebook_campaigns_amazon_us.runJobInTOS(facebook_campaigns_amazon_us.java:5905)
    at mava2.facebook_campaigns_amazon_us_0_1.facebook_campaigns_amazon_us.main(facebook_campaigns_amazon_us.java:5575)

【问题讨论】:

  • 您可以尝试打印出问题中包含的代码之前的行 (System.out.println(row4);) 吗?这可能会告诉你问题出在哪里。如果您无法弄清楚,请包含控制台输出,我很乐意为您提供帮助。
  • 一回到我的电脑,我就会拍一些屏幕截图。并将它们放在 weTransfer 上,因为我还不能发布图片。我也无法打印该行,因为当我将 csv 输出与数据库链接时,所有这些都发生在 tMap 中。非常感谢!我会尽快发布照片。
  • 我添加了错误日志。
  • 我不知道该放在哪里。因为我在链接时执行了我在 tMap 中提到的代码。有没有办法先打印出来?我不知道。我是新来的。
  • 所以我的错误来自 tmap。我只知道从 tJava 元素打印

标签: java string talend tmap


【解决方案1】:
java.lang.StringIndexOutOfBoundsException: String index out of range: -1

告诉我们有一个非空字符串不包含您要查找的字符。

在您的情况下,当有 (空格)或 " 时,可能会发生这种情况。

使用 Java 重现它看起来像这样:

String test = "\"Other \n\nthings\"";

test = test.contains(" ") ? test.substring(0, test.indexOf(" ")) : test;

System.out.println(test); // "Other


System.out.println(test.contains("\"") ?
     test.substring(test.indexOf("\"")+1,test.lastIndexOf("\"")) : "null"); // error!

您收到错误是因为在您运行第二次验证时,字符串为 "Other,这意味着

test.contains("\"") ? test.substring(test.indexOf("\"")+1,test.lastIndexOf("\"")) : "null"

实际上解析为

test.contains("\"") ? test.substring(0+1, 0) : "null"

并且由javadoc指定

IndexOutOfBoundsException - 如果 beginIndex 为负数,或者 endIndex 大于此 String 对象的长度,或者 beginIndex 大于 endIndex。

在您的情况下,beginIndex 为 1,endIndex 为 0,这就是抛出 StringIndexOutOfBoundsException 的原因。

为了防止该错误被抛出,而不是使用

row4.Ad_Set_Name.contains("\"")

使用

row4.Ad_Set_Name.indexOf('"', 2) != -1

这将确保您的字符串至少出现 2 次字符 "

【讨论】:

  • 这可能是你所说的,但在我的情况下仍然不起作用。我的字符串中没有任何 "\"" 并且对于 intex 仍然失败
【解决方案2】:

我解决了这个问题。在 tFileInputDelimited 元素中,我没有检查 CSV 选项。因为 Talend 读取带有“”的多行单元格,所以我必须在“\””上设置转义字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    相关资源
    最近更新 更多