如何摆脱字符串

时间:2018-04-27 14:48:42

标签: java string talend tmap

当我尝试对字符串执行某些操作时,我的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 =“其他vc_7days”某事“第3”,第一行将返回“其他”,第二行返回“某事”。但是当我有Ad_Set_Name =

“的其他

东西” 我有索引错误,如:“StringIndexOutOfBoundsException:String index out of range:-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)

2 个答案:

答案 0 :(得分:0)

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次字符"

答案 1 :(得分:0)

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