Как избавиться от ввода в строку - PullRequest
0 голосов
/ 27 апреля 2018

У меня проблема в моем tMap, когда я пытаюсь выполнить некоторые операции с моей строкой. У меня есть CSV, который имеет Ad_Set_Name, который в некоторых строках имеет больше строк в ячейке. Я использую следующее:

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" что-то "3-я", первая строка вернет "Other", а вторая "что-то". Но когда у меня есть Ad_Set_Name =

"Другое

вещи» У меня есть ошибка индекса как: "StringIndexOutOfBoundsException: String index вне диапазона: -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 голосов
/ 30 апреля 2018

Я решил проблему. В элементе tFileInputDelimited я не проверял параметры CSV. Поскольку Talend считывает ячейку с несколькими строками с "", мне нужно было установить escape-символ на "\" ".

0 голосов
/ 27 апреля 2018
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 вхождения символа ".

...