Разбор внешнего файла со столбцами формата JSON - PullRequest
0 голосов
/ 08 мая 2019

Я новичок в этом сайте, поэтому, пожалуйста, дайте мне знать, если я что-то сделал не так. Я работаю над 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();
        }
    }
}

1 Ответ

0 голосов
/ 08 мая 2019

Если источник данных один и не изменяется, вы можете использовать этот онлайн-конвертер CSV в JSON , который имеет удобную функцию "Parse JSON", которая преобразует значения JSON в cast и crew столбца во вложенные объекты 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();

Лично мне нравится библиотека Джексона. Он поддерживает JSON "из коробки" и может быть расширен для поддержки многих других форматов, таких как YAML и CSV .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...