我有两个CSV文件:"用户特征";以及";itemfeatures";。userfeature中的每一行都与特定用户相关。例如,用户特征文件中的第一行是:
005c2e08","Action","nm0000148","dir_ nm0764316","USA"
我需要找到这一行与第二个文件"的每一行的交点;itemfeatures";。(实际上,我需要对所有用户重复此过程,即对"userfeatures"的所有行重复此过程)。
因此,第一个比较将与";itemfeatures";即:
"tt0306047","Comedy,Action","nm0267506,nm0000221,nm0356021","dir_ nm0001878","USA"
交集的结果应该是["Action", "USA]"
,但不幸的是,我的代码只找到["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"
是一个词,所以找不到[Action]
是"Comedy,Action"
和"Action"
的交集。如果有人知道如何解决这个问题,我将不胜感激。
尝试删除两个字符串中的双引号。
因为当你拆分时
"tt0306047","喜剧,动作","nm0267506,nm0000221,nm0356021","目录_nm0001878","美国"
你会得到
行动"
代币,永远不会匹配
"行动"
代币。
如果打印行,它是什么样子的?我认为你的问题在于阅读文件,例如:
"005c2e08","Action","nm0000148","dir_nm0764316","USA"
按","拆分将导致:
"005c2e08"行动"
等等。而你的第二条线将是:
"tt0306047"喜剧行动"
这就是为什么美国正在拦截,但行动并没有。
使用csv阅读器读取csv文件,然后用逗号分隔csv行的属性。这样你就可以去掉quoutes,你的代码就会在中工作
例如,这个库对于读取CSV文件非常方便:
http://opencsv.sourceforge.net/