Как проверить, существует ли несколько строк условий в CSV с помощью BufferedReader?

Я использую BufferedReader для проверки наличия нескольких строк в файле, и я использую следующий сценарий:

int n = 41; // The line number
String line;
BufferedReader br = new BufferedReader(new FileReader(context.tfilelistdir)); 
for (int i = 0; i < n; i++)
{
    line = br.readLine();
    if (line.contains("$$WORDS$$ ABC") && line.contains("$$WORDS$$ XYZ"))
    {
        do something
    }
}

Здесь мне нужно проверить, существуют ли строки $$WORDS$$ ABC и $$WORDS$$ XYZ в разных строках / столбцах в файле csv. Строка BufferedReader не принимает &&. Он работает только с условием || (ИЛИ). BufferedReader перезаписывает записи, поскольку он продолжает читать записи.

Есть ли способ проверить, существуют ли оба условия (существуют строки) в файле CSV?


person Tommy    schedule 25.11.2020    source источник


Ответы (1)


Если подстроки находятся в разных строках, необходимо ввести некоторые логические флаги для отслеживания каждого конкретного условия.

Кроме того, лучше использовать try-with-resources, чтобы убедиться, что ресурсы файла / чтения закрыты должным образом, и проверить, не достигнут ли конец файла в процессе чтения (тогда br.readLine() вернет null).

int n = 41; // The line number
String line;
try (BufferedReader br = new BufferedReader(new FileReader(context.tfilelistdir))) {
    boolean foundABC = false;
    boolean foundXYZ = false;
    int i = 0;
    while ((line = br.readLine()) != null && i++ < n) { // read at most n lines

        foundABC |= line.contains("$$WORDS$$ ABC"); // will be true as soon as ABC detected
        foundXYZ |= line.contains("$$WORDS$$ XYZ"); // will be true as soon as XYZ detected
        if (foundABC && foundXYZ) { // not necessarily in the same line
            //do something
        }
    }
}
person Alex Rudenko    schedule 25.11.2020
comment
Спасибо за решение, оно идеальное - очень ценю. У меня есть небольшая настройка, так как я хотел бы печатать только строку (строки), где есть совпадение, а не печатать все внутри цикла if - как я могу это сделать, поскольку Я использую при печати все строки с выводом, например if (foundABC && foundXYZ) {System.out.println (MATCH 1 FOUND); //System.out.println(line); } - person Tommy; 25.11.2020
comment
Случай 2: мне также нужно будет проверить разные условия с помощью цикла if, например, если разные другие строки имеют совпадение с другим условием, поэтому я написал это так: foundABC | = line.startsWith ($$ WORDS $$ 9) ; foundXYZ | = line.contains (COND = Test); иначе, если (foundABC && foundXYZ) {System.out.println (MATCH 2 FOUND); //System.out.println(line); } аналогично мне нужно проверить различные условия / совпадения на основе логического флага, который он должен входить в этот вложенный цикл if, и распечатать только ту конкретную строку, имеющую совпадение, является ли код точным? - person Tommy; 25.11.2020
comment
1. Вы можете сбросить флаги, как только будут найдены оба шаблона, или добавить флаги внутри цикла и проверить, выполняются ли условия также для текущей строки: boolean currFoundABC = line.contains("$$WORDS$$ ABC"); boolean currFoundXYZ = line.contains("$$WORDS$$ XYZ"); foundABC |= currFoundABC; foundXYZ |= currFoundXYZ; if (foundABC && foundXYZ && (currFoundABC || currFoundXYZ)) {/* match found */} - person Alex Rudenko; 26.11.2020
comment
Спасибо, я попробую. И последнее, как мне использовать bufferedreader.readLines () и получить значение из файла csv. В файле много строк, и будет одна строка, а именно $$ NAME $$ TOM, мне нужно найти или сопоставить имя идентификатора и захватить значение после $$ и сохранить TOM в строковой переменной для обработки ... Я прошу, потому что я жестко кодирую значения для проверки в IF-условии для текущего требования, но для получения имени мне нужно найти значение и сохранить его. Заранее спасибо, действительно здорово - person Tommy; 26.11.2020
comment
Возможно, последнее, что потребовалось бы для поиска шаблона с использованием регулярного выражения, но это, кажется, слишком много для вопросов в комментариях :) Кроме того, для случая 2 потребуются дополнительные пояснения, и особенно входные данные, ожидаемые результаты и фактические выходы. Пожалуйста, не стесняйтесь размещать новый вопрос в SO, когда он у вас есть, и не забывайте принимать / голосовать за полезные ответы. - person Alex Rudenko; 26.11.2020
comment
Спасибо, Алекс ценю вашу помощь, я создал отдельный поток для извлечения значений из полей, так как здесь мы только что говорили о условии if, чтобы проверить, существует ли только значение. Пожалуйста, посмотрите, когда у вас будет возможность, и поделитесь своим мнением stackoverflow.com/questions/65033185/ - person Tommy; 27.11.2020
comment
У меня есть небольшой запрос, есть одно условие, при котором, если одна из строк столбца начинается с $$ PHONE $$ 9 и имеет другой столбец, где COND = x, тогда значение строки string name = tom Else, если столбец начинается с $$ PHONE $$ 9 и НЕ имеет строки, в которой читается COND = X, затем строка name = james - person Tommy; 04.12.2020
comment
логическое curroper9 = line.startsWith ($$ PHONE $$ 9); oper9 | = curroper9; логическое значение currcondmicro = line.contains (COND = X); condmicro | = currcondmicro; логическое currcondnotmicro =! line.contains (COND = Microsite); condnotmicro | =! currcondnotmicro; иначе, если (curroper9 && currcondmicro && (curroper9 || condmicro)) {System.out.println (ИМЯ ТОМ); } else if (curroper9 && currcondnotmicro && (curroper9 || currcondnotmicro)) {System.out.println (ИМЯ ДЖЕЙМС); } он не будет печатать только одну строку вывода, и результат будет неправильным - person Tommy; 04.12.2020
comment
Не могли бы вы помочь, как я могу точно подобрать условие и убедиться, что оно правильное? - person Tommy; 04.12.2020