2014-10-26 2 views
0

В текстовом файле у меня есть следующие записиJava-код для поиска строк и других, связанных строк

1|002|3|Lubna|M|141021081331| 

2|003|3|Rashid|1|141021081431| 

3|002|3|Amal|M|141021081340| 

4|002|3|Lubna|F|141021081531| 

Я хочу, чтобы создать код Java для проверки существования |M|; то есть Lubna что-то ищет. И проверить после этого, если Lubna нашел то, что искал, и это произойдет, если за тем же именем пользователя будет |F|.

, например:

1|002|3|Lubna|M|141021081331| ---> Lubna is searching 
1|002|3|Lubna|F|141021081531| ---> Lubna found what she was searching about 

1|002|3|Amal|M|141021081340|----> Amal is searching 

Но поскольку нет амал записи включают в себя |F| так, что означает, что она все еще ищет ..
Обеспечение записи может быть неограниченным, то есть не только 4, как в приведенном выше примере ..
Так что я сделал следующий:

String st;   
// where 14 is num of columns in record , like in our examle they are 6 
String [] subst= new String [14] ; 
while ((st = inputStream.readLine()) != null) { 
    if (st.contains("|M|")) { 
     for (int i = 0; i < 14; i++) { 
      subst=st.split("[|]"); 
     } 
     System.out.println(subst); 
     n++; 
    } 
    else 
    if (st.contains("|F|")) { 
     // System.out.println(EmailBody[j]);      
    } 
} 

в этом случае мне удастся сделать это SUBST не только 1 размер массива строки, но сделайте это 2, я могу найти существование |F|, но проблема в том, что я не могу инициализировать такие массивы такого типа, потому что я не знаю, каким будет его второе измерение.

Любой может помочь мне, если найти самый простой способ достичь моей потребности?

ответ

0

Попробуйте регулярные выражения. Но будьте осторожны с огромным количеством данных. Может быть медленным.

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class SearchDemo { 

    public static void main(String[] args) { 
     String data = "1|002|3|Lubna|M|141021081331|\n" 
       + "2|003|3|Rashid|1|141021081431|\n" 
       + "3|002|3|Amal|M|141021081340|\n" 
       + "4|002|3|Lubna|F|141021081531|"; 

     Pattern p = Pattern.compile("^\\d+[|]\\d+[|]\\d+[|]([^|]+)[|]([M]?)[|]\\d+[|]", Pattern.MULTILINE); 
     Matcher m = p.matcher(data); 
     while (m.find()) { 
      System.out.println("search name: " + m.group(1) + " type: " + m.group(2)); 
      Pattern p2 = Pattern.compile("^\\d+[|]\\d+[|]\\d+[|](" + m.group(1) + ")[|]([F]?)[|]\\d+[|]", Pattern.MULTILINE); 
      Matcher m2 = p2.matcher(data); 
      if (m2.find()) { 
       System.out.println("found name: " + m2.group(1) + " type: " + m2.group(2)); 
      } else { 
       System.out.println("no match name: " + m.group(1) + " type: " + m.group(2)); 
      } 
     } 
    } 
} 
+0

Большое вам спасибо, я думаю, что я ищу .. я попробую, и я вернусь к вам с моими результатами. – L29101987

+0

как я может написать следующее: – L29101987

+0

Паттерн p: 002 | 0000 | 00 | 00002392651 | 41932.3409953704 | 00032018 | M | | 1 | 2 | номер 2 | guest03 guest03 | 0 | 141020081102 | – L29101987

1

"the problem is that I can't initialize such this kind of arrays because I don't know what its second dimension will be.."

Вы хотите посмотреть в collections структуру, которая позволяет создавать списки без указания размера.

Итак:

ArrayList<String> list = new ArrayList<String>(); 

Затем вы можете добавить в список stufff:

list.add("stuff"); 
list.add("stuff2"); 
list.add("stuff3"); 
//as many time as you want 

Loop

for(String str : list) 
{ 
    System.out.println(str); 
} 

А потом остальной код.

Для учебника по коллекциям, фотографии caveOfProgramming

+0

перебор с помощью индекса, как правило, не то, что вы хотите сделать. Вместо этого используйте итераторы! for (String str: list) ... –

+0

@haywire Я согласен и благодарю за редактирование. Я просто подумал, что для OP будет легче обойти – gudthing

0

нагрузки, как это, то итерация LinesList

String filename = "myfile.txt"; 
    List<String> LinesList = new ArrayList<String>(); 
    Path filePath = new File(filename).toPath(); 
    Charset charset = Charset.defaultCharset(); 
    try { 
     LinesList = Files.readAllLines(filePath, charset); 
    } catch (Exception e) { 
     if (e instanceof NoSuchFileException) { 
      System.out.println("error: file not found!"); 
     } else { 
      e.printStackTrace(); 
      System.exit(101); 
     } 
    } 
+0

Большое вам спасибо, я думаю, что чтение всей строки файла решит часть моей проблемы, .. большое вам спасибо .. – L29101987

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