2016-12-16 2 views
-3

У меня есть файл с запятыми, который имеет "\N" для некоторых строк. Мне нужно загрузить все строки и пропустить все, что не содержит \N. Я пытаюсь сделать следующее, но это не сработает.Проверить символ пробела в Java

if (!line.contains("\\N")) { 
    //do load here 
} 

Над кодом до сих пор проходит линия из CSV ниже:

1,text,abc,\N,23,56 

и тогда мы имеем NumberFormatException (он должен быть Int Value есть). Почему это происходит?

+1

* Мне нужно загрузить все строки и пропустить все, что не содержит \ N. * Вы имеете в виду те **, содержащие ** \ N, правильно? – shmosel

+1

Пожалуйста, положите [mcve] – GhostCat

+1

Пожалуйста, добавьте еще один код, который вы сделали, чтобы мы могли помочь вам с проблемой. – Joe

ответ

0

Если вы хотите обрабатывать только строки файлов, содержащие \ N, тогда опустите ! (восклицательный знак) знак из если состояние выписки. Это флаг НЕ.

Что ваше состояние в основном говорят прямо сейчас:

Если текущая строка текстового файла, содержащийся в строке переменной линия не содержит \ N затем сделать выполнение кода внутри если блок заявления.

IF операторы выполняются только при условии поставки условие булево верно. Применение! флаг в основном устанавливает условие на true, если поставленное условие равно NOT true. This может помочь вам больше.

Если вы хотите только те строки, которые содержат \ N, то ваш код должен выглядеть следующим образом:

if (line.contains("\\N")) { 
    //process line here 
} 

Если вы НЕ хотите обрабатывать эти строки файлов, которые содержат \ N то, что вы используете прямо сейчас должен работать просто отлично.

Что касается Вашего вопроса:

и тогда мы имеем NumberFormatException (он должен быть Int Value есть). Почему это происходит?

\ п (в нижнем регистре п), как правило, тег, который применяется в строке, чтобы заставить новую линию при обработке, если в верхнем регистре N используется он не делает этого. В общем, в большом количестве файлов CSV используется \ N, что означает NULL, а другие просто ничего не помещают, просто разделитель.Вам нужно будет посмотреть, что создает CSV-файл, чтобы найти фактическую причину по , почему, так как они могут использовать его для чего-то другого, но на данный момент вы можете считать его NULL. Целые переменные никогда не Null, то они будут рассматриваться как содержащие 0, по умолчанию, так что вы могли бы изменить свой код:

if (line.contains("\\N") { line = line.replace("\\N", "0"); } 

Вы, однако, может также столкнуться \ N там, где должна быть строка, так что выше линии будет тебе нехорошо. Одним из решений будет обрабатывать \ N в содержимом каждого элемента массива (она должна быть там) после того, как вы разделили файл строку, например:

String csvFilePath = "MyCSVfile.txt"; // assuming file is in classpath 
try (BufferedReader br = new BufferedReader(new FileReader("MyCSVfile.txt"))) { 
    int j = 0; //used as a counter 
    String line = ""; 
    while ((line = br.readLine()) != null) { 
     j++; //increment counter 
     String[] data = line.split(","); 
     //if the ID value contains null then apply the counter (j) value. 
     int id = Integer.parseInt(data[0].replace("\\N",String.valueOf(j))); 
     String type = data[1].replace("\\N",""); 
     String text = data[2].replace("\\N",""); 
     int value1 = Integer.parseInt(data[3].replace("\\N","0")); 
     int value2 = Integer.parseInt(data[4].replace("\\N","0")); 
     int value3 = Integer.parseInt(data[5].replace("\\N","0")); 
     System.out.println("ID is:\t\t" + id + "\nData Type is:\t" + type + 
          "\nText is:\t" + text + "\nValue 1 is:\t" + value1 + 
          "\nValue 2 is:\t" + value2 + "\nValue 3 is:\t" + 
          value3 + "\n"); 
    } 
    br.close(); 
} 
catch (IOException ex) { 
    //however you want to handle exception 
} 

Это будет обрабатывать \ N тег независимо от того, где он встречается в любой из ваших строк в CSV-файлах.

+1

Никогда не рекомендуется печатать сообщение об исключении. Сообщения часто не имеют смысла без контекста класса исключения, и во многих исключениях вообще нет сообщения. Всегда выполняйте 'ex.printStackTrace();' или отправляйте исключение в метод журнала, который будет регистрировать трассировку стека. – VGR

+0

@ VGR - Хорошая точка ... Я не понимал, что исключение IOException не было исключением, которое «не» дало разумное сообщение. – DevilsHnd

Смежные вопросы