我是这个网站的新手,所以如果我做错了事,请告诉我。我正在凯文·培根(Kevin Bacon)的6度项目上工作,该项目需要一个外部CSV文件并读取未加权图中的所有数据,并允许运行该项目的用户找到从凯文·培根到另一个人的最短路径距离。我坚持要找出如何正确读取CSV文件中所有数据的方法,因为该列中有四分之二包含JSON格式的条目。
我很高兴看到我遇到的任何事情,并随时请我详细说明您是否需要我:)
我已经尝试实现JSON简单解析器,并且我坚持使用它,因为它易于安装并且其功能相当简单。外部CSV文件太大,但是看起来是这样的:
/*
movie_id,title,cast,crew
19995,Avatar,"[{""cast_id"": 242, ""character"": ""Jake Sully"", ""credit_id"": ""5602a8a7c3a3685532001c9a"", ""gender"": 2, ""id"": 65731, ""name"": ""Sam Worthington"", ""order"": 0}, {""cast_id"": 3,
*/
这是我尝试过的:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.util.Scanner;
import org.json.simple.parser.JSONParser;
public class MrBacon {
public static void main(String[] args) throws Exception
{
// TODO Auto-generated method stub
JSONParser parser = new JSONParser();
if(args.length < 2)
{
throw new Exception("Input File Error");
}
Scanner reader = new Scanner(new FileInputStream(args[0]));
int size = 5000;
Graph graph = new Graph(size);
try
{
BufferedReader br = new BufferedReader(new FileReader("tmdb_5000_credits.csv"));
StringBuilder st = new StringBuilder();
String title, line;
String[] actors;
while((line = br.readLine())!= null)
{
int col = 0;
char [] words = line.toCharArray();
for(int i = 0; i < words.length; i ++)
{
if(words[i] == ',')
{
col++;
}
else if(words[i] = )
{
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
答案 0 :(得分:0)
如果数据源是一个且未更改,则可以使用具有方便的“解析JSON”功能的this online CSV to JSON converter,该功能将转换cast
和crew
列中的JSON值到嵌套的JSON对象中。
然后,您将使用JSON.simple,Gson或Jackson来解析纯JSON数据。
例如,
movie_id,title,cast,crew
19995,Avatar,"[{""cast_id"": 242, ""character"": ""Jake Sully"", ""credit_id"": ""5602a8a7c3a3685532001c9a"", ""gender"": 2, ""id"": 65731, ""name"": ""Sam Worthington"", ""order"": 0}]",null
成为:
[
{
"movie_id": 19995,
"title": "Avatar",
"cast": [
{
"cast_id": 242,
"character": "Jake Sully",
"credit_id": "5602a8a7c3a3685532001c9a",
"gender": 2,
"id": 65731,
"name": "Sam Worthington",
"order": 0
}
],
"crew": null
}
]
如果这不可行,例如,您可能会告诉CSV解析库在引号中找到分隔符时忽略分隔符。
如果使用Opencsv,请查看CSVParserBuilder
类。它有一个#withIgnoreQuotations(boolean)
方法可以完成这项工作。
以下内容来自CSVReaderBuilder
类的说明。
CSVParser parser = new CSVParserBuilder()
.withSeparator(',')
.withQuoteChar('"')
.withIgnoreQuotations(true)
.build();
CSVReader reader = new CSVReaderBuilder(new FileReader("tmdb_5000_credits.csv"))
.withSkipLines(1)
.withCSVParser(parser)
.build();