2012-06-26 3 views
1
public void GrabData() throws IOException 
{ 
    try { 
     BufferedReader br = new BufferedReader(new FileReader("data/500.txt")); 
     String line = ""; 
     int lineCounter = 0; 
     int TokenCounter = 1; 
     arrayList = new ArrayList <String>(); 

     while ((line = br.readLine()) != null) { 

      //lineCounter++; 
      StringTokenizer tk = new StringTokenizer(line, ","); 

      System.out.println(line); 

      while (tk.hasMoreTokens()) { 
       arrayList.add(tk.nextToken()); 
       System.out.println("check"); 
       TokenCounter++; 

       if (TokenCounter > 12) { 
        er = new DataRecord(arrayList); 
        DR.add(er); 
        arrayList.clear(); 
        System.out.println("check2"); 

        TokenCounter = 1; 
       } 

      } 
     } 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(Driver.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

Здравствуйте, я использую токенизатор, чтобы прочитать содержимое строки и сохранить ее в araylist. Здесь класс GrabData выполняет эту работу.используя токенизатор для чтения строки

Единственная проблема заключается в том, что название компании (которая является третьим столбцом в каждой строке) находится в кавычках и содержит запятую. Я включил одну строку для вашего примера. Знаменатель зависит от запятой, чтобы разделить линию на разные маркеры. Но название компании выбрасывает это, я думаю. Если бы не запятая в колонке компании, все будет как обычно.

Пример: - Essie, Vaill, "Litronic, Industries", 14225 Hancock Dr, Anchorage, Анкоридж, Аляска, 99515,907-345-0962,907-345-1215, Essie @ vaill.com, HTTP: //www.essievaill.com

Любые идеи?

ответ

1

Хотя StringTokenizer не может изначально справиться с этим для вас, пару строк кода будет делать это ... вероятно, не самый эффективный, но должны получить идею через ...

while(tk.hasMoreTokens()) { 
    String token = tk.nextToken(); 

    /* If the item is encapsulated in quotes, loop through all tokens to 
    * find closing quote 
    */ 
    if(token.startsWIth("\"")){ 
     while(tk.hasMoreTokens() && ! tk.endsWith("\"")) { 
      // append our token with the next one. Don't forget to retain commas! 
      token += "," + tk.nextToken(); 
     } 

     if(!token.endsWith("\"")) { 
      // open quote found but no close quote. Error out. 
      throw new BadFormatException("Incomplete string:" + token); 
     } 

     // remove leading and trailing quotes 
     token = token.subString(1, token.length()-1); 
    } 
} 
+0

его намного проще с помощью split() –

2

Прежде всего, StringTokenizer считается устаревшим кодом. From Java doc:

StringTokenizer - это унаследованный класс, который сохраняется по соображениям совместимости, хотя его использование не рекомендуется в новом коде. Рекомендуется, чтобы любой, кто ищет эту функциональность, использовал метод split для String или пакет java.util.regex.

Использование метода split() позволяет получить массив строк. Итерируя через массив, вы можете проверить, начинается ли текущая строка с котировки, и если это случай, проверьте, заканчивается ли следующая с цитатой. Если вы встретите эти 2 условия, вы знаете, что вы не разделились там, где хотели, и вы можете объединить эти 2 вместе, обработать их так, как вы хотите, и продолжить итерацию через массив, как правило, после этого. В этом случае вы, вероятно, сделаете i + = 2 вместо обычного i ++, и он останется незамеченным.

+0

спасибо, я рассмотрю использование метода split() –

2

Вы можете выполнить это использование регулярных выражений. Следующий код:

 String s = "asd,asdasd,asd\"asdasdasd,asdasdasd\", asdasd, asd"; 
     System.out.println(s); 
     s = s.replaceAll("(?<=\")([^\"]+?),([^\"]+?)(?=\")", "$1 $2"); 
     s = s.replaceAll("\"", ""); 
     System.out.println(s); 

дает

asd,asdasd,asd, "asdasdasd,asdasdasd", asdasd, asd 
asd,asdasd,asd, asdasdasd asdasdasd, asdasd, asd 

, которые от моего понимания, является предварительной обработкой вам требуется для Tokenizer-коды для работы. Надеюсь это поможет.

1

Как вы можете видеть, в описании класса использование StringTokenizer обескуражено Oracle. Вместо использования токенизатора я бы использовал метод String split() , который вы можете использовать в качестве аргумента в качестве аргумента и значительно сократить свой код.

String str = "Essie,Vaill,\"Litronic , Industries\",14225 Hancock Dr,Anchorage,Anchorage,AK,99515,907-345-0962,907-345-1215,[email protected],http://www.essievaill.com"; 
    String[] strs = str.split("(?<!),(?!)"); 
    List<String> list = new ArrayList<String>(strs.length); 

    for(int i = 0; i < strs.length; i++) list.add(strs[i]); 

Просто обратите внимание на ваше регулярное выражение, используя это вы предполагая, что запятая будет всегда между пространствами.

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