有没有一种方法可以直接拆分和使用巨大文件中的字符串?

时间:2019-01-25 04:52:19

标签: java split stream streamreader filesize

我正在尝试解析Huuuge JSON文件并将其转换为CSV。 JSON文件包含许多对象,这些对象之间用''(空格)分隔。对象甚至不包含在列表“ [{...},{...}]”中 这是一个对象类型。在文件中,有成千上万个彼此跟随: {“ name”:“ cmp1”,“ homepage_url”:“ http://google.fr”,“员工人数”: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 -><-

                                    }
                            }
                    }

我希望每次找到一个完整的对象时都能够处理数据。这是一个非常大的文件(150mo)。因此,一次性阅读所有内容是不可能的。

1 个答案:

答案 0 :(得分:0)

  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
               }
            }
          }
        }
    }