【问题标题】:Parsing an External File with JSON format columns解析具有 JSON 格式列的外部文件
【发布时间】:2019-05-07 21:41:24
【问题描述】:

我是这个网站的新手,所以如果我做错了什么,请告诉我。我正在研究一个 6 度的 Kevin Bacon 项目,该项目采用外部 CSV 文件并读取未加权图表中的所有数据,并允许运行该项目的用户找到从 Kevin Bacon 到另一个人的最短路径距离。我坚持的是弄清楚如何正确读取 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();
        }
    }
}

【问题讨论】:

  • 现有很多很棒的用于解析 CSV 文件的库。他们处理诸如转义/取消转义特殊字符之类的事情,以及您可能不想自己处理的其他细节。 stackoverflow.com/questions/10462507/…
  • @dnault 谢谢!我检查了一下,我认为 openCSV 将是一个不错的选择,但我不知道如何实现它,因为有些电影的名称中有逗号,我需要能够忽略那些但处理一个分隔列

标签: java arrays json parsing graph


【解决方案1】:

如果数据源是一个并且没有更改,您可以使用 this online CSV to JSON converter,它具有方便的“解析 JSON”功能,可以将 castcrew 列中的 JSON 值转换为嵌套的 JSON 对象。

然后您将使用JSON.simpleGsonJackson 来解析纯 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();

我个人喜欢杰克逊图书馆。它支持开箱即用的 JSON,并且可以扩展以支持许多其他格式,例如 YAMLCSV

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    相关资源
    最近更新 更多