Есть ли способ разделить и использовать напрямую строки из огромного файла? - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь разобрать файл Huuuge JSON и перевести его в CSV. Файл JSON содержит множество объектов, разделенных символом '' (пробел). Объекты даже не включены в список '[{...}, {...}]' Вот тип объекта. В этом файле тысячи их подписчиков: { "Имя": "CMP1", "homepage_url": "http://google.fr","number_of_employees":0.0,"founded_year":0.0,"founded_month":0.0,"founded_day":0.0,"deadpooled_year":0.0,"total_money_raised":"5000"}

Посмотрите каждый символ и найдите объекты в JSON благодаря количеству '{' и '}'. Но это так медленно.

RandomAccessFile raf = new RandomAccessFile(JsonInputFilePath, "rw");
            int now = 0;
            int open =0;
            int close = 0;
            String currentNode = "";
             long length = raf.length();
            while(length > now) {
                currentNode = currentNode +  (char)raf.readByte();

            raf.seek(now);
                            now++;
            char currentChar = (char)raf.readByte();
            if( currentChar == '{') {
                open ++;
            }
            if( currentChar == '}') {
                close = close +1;
                if(close  == open) {

                    open = 0;
                    close = 0;
                    JsonReader reader = new  JsonReader(new StringReader(currentNode));
                                            //process data with the Json reader -><-

                                    }
                            }
                    }

Я хочу иметь возможность обрабатывать данные каждый раз, когда обнаруживается полный объект. Это для очень большого файла (150 месяцев). Поэтому читать все за один раз не вариант.

1 Ответ

0 голосов
/ 25 января 2019
  1. Не используйте здесь RandomAccess, это всего лишь сценарий использования seq-доступа.
  2. Реализация простого DFA с базовым стеком (уровень)
  3. Раздельный анализфайл с разбора json

    public void processObject(String json) {
        System.out.println(json);
    }
    
    public void read(String file) throws IOException {
        try (FileReader r = new FileReader(file)) {
          int i;
          int level = 0;
          StringBuilder sb = new StringBuilder();
          while((i = r.read()) != -1) {
            char c = (char)i;
            switch(c) {
             case '{':
               sb.append(c);
               level++;
               break;
             case '}':
              sb.append(c);
              level--;
              if (level == 0) {
                processObject(sb.toString());
                sb = new StringBuilder();
              }
              break;
             default:
               if (level > 0) {
                 sb.append(c);
               }
               else {
                 // Ignore chars between objects
               }
            }
          }
        }
    }
    
...