2015-12-08 8 views
0

У меня есть два файла CSV: «userfeatures» и «itemfeatures». Каждая строка в пользовательской функции связана с конкретным пользователем. например, первая строка в файле userfeature является:не может найти правильное пересечение двух строковых массивов, когда есть запятая в строках

005c2e08","Action","nm0000148","dir_ nm0764316","USA"

Мне нужно найти пересечение этой линии с каждой строкой 2-го файла «itemfeatures». (На самом деле, мне нужно повторить эту процедуру для всех пользователей, т. Е. Для всех строк «userfeatures»).

Итак, первое сравнение будет с первой линией «itemfeatures», то есть:

"tt0306047","Comedy,Action","nm0267506,nm0000221,nm0356021","dir_ nm0001878","USA"

Результат пересечения должен быть ["Action", "USA]" но, к сожалению, мой код только находит [ «США»] как матч. Вот то, что я пытался до сих пор:

public class Main { 
    public static void main(String[] args) throws Exception { 
    BufferedReader userfeatures = new BufferedReader(new FileReader("userFeatureVectorsTest.csv")); 
    BufferedReader itemfeatures = new BufferedReader(new FileReader("ItemFeatureVectorsTest.csv"));  
    ArrayList<String> userlines = new ArrayList<>(); 
    ArrayList<String> itemlines = new ArrayList<>(); 
    String Uline = null;  
     while ((Uline = userfeatures.readLine()) != null) { 
      for (String Iline = itemfeatures.readLine(); Iline != null; Iline = itemfeatures.readLine()) { 
       System.out.println(Uline); 
       System.out.println(Iline);     
       System.out.println(intersect(Uline, Iline)); 
       System.out.println(union(Uline, Iline)); 
      } 
     } 
userfeatures.close(); 
itemfeatures.close(); 
}  
    static Set<String> intersect(String Uline, String Iline) { 
     Set<String> result = new HashSet<String>(Arrays.asList(Uline.split(","))); 
     Set<String> IlineSet = new HashSet<String>(Arrays.asList(Iline.split(","))); 
     result.retainAll(IlineSet); 
     return result; 
    } 
    static Set<String> union(String Uline, String Iline) { 
     Set<String> result = new HashSet<String>(Arrays.asList(Uline.split(","))); 
     Set<String> IlineSet = new HashSet<String>(Arrays.asList(Iline.split(","))); 
     result.addAll(IlineSet); 
     return result; 
    } 
} 

Я думаю, что проблема связана с Uline.split(",") и Iline.split(","), потому что они считают "Comedy,Action" как 1 слово и поэтому он не может найти [Action], как пересечение "Comedy,Action" и "Action". Я ценю, если кто-то знает, как исправить эту проблему. Большое спасибо,

+0

Потому что, когда вы разделяете с '' вы получаете '» Действие «' и 'Action» '. –

ответ

2

Попробуйте удалить двойные кавычки в обеих строках.

Потому что, когда вы разделяете

"tt0306047", "Комедия, Приключения", "nm0267506, nm0000221, nm0356021", "dir_ nm0001878", "США"

Вы получите

Действие»

маркер, который никогда не будет соответствовать

"Действие"

фишку.

+0

спасибо за ваш ответ. Извините, я редко отношусь к Java. Должен ли я использовать' line = line.replace ("\" "," ");'? – mOna

+0

Это сработало :) супер быстро и легко, спасибо: D – mOna

+0

Ницца, у меня есть день :) – Berger

1

Если вы печатаете свою линию, как она выглядит? Я думаю, ваша проблема в чтении файла, например:

"005c2e08", "Действие", "nm0000148", "dir_ nm0764316", "США"

раскол на '' приведет к:

"005c2e08" "Действие"

и так далее. В то время как для второй линии будет:

«tt0306047» «Комедия Действие»

Вот почему США перехватывает, но действие не является.

Используйте считыватель csv для чтения в CSV-файле, затем разделите атрибуты CSV-строки запятой. Таким образом, вы избавиться от quoutes и ваш код будет работать

, например, эта библиотека очень удобна для чтения CSV файлов:

http://opencsv.sourceforge.net/

+0

спасибо за ваш ответ. Я попробую и дам вам знать :) – mOna

+0

Не беспокойтесь. Это должно действительно работать из коробки для вашего примера. В противном случае вы можете указать opencsv, что ваш разделитель и какова ваша цитата. Таким образом, он будет рассматривать запятые внутри кавычек как таковые, а внешние кавычки в качестве разделителей для вашего CSV. На их веб-сайте есть хороший пример. – pandaadb

+0

Большое спасибо за вашу помощь. Я получил ответ, просто удалив «» из обеих строк :) – mOna

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

  • Нет связанных вопросов^_^