解析和操作奇怪格式的数据,同时保持格式化

时间:2014-07-22 23:16:56

标签: java parsing

我是一个非常新手的程序员,基本上我正在尝试解析和操作DL_POLY配置文件,该文件具有布局

 CONFIG file created from Xmol file config.xmol                                 
         2         3  10000000    0.5000000000E-03
     31.309729731729      0.000000000000      0.000000000000
      0.000000000000     31.309729731729      0.000000000000
      0.000000000000      0.000000000000     31.309729731729
Ca              1
     6.421269411        -1.034199034         1.228702751    
  -1.06475894897       1.10274459622       1.31459311620    
  -6319.67959205      -10299.4183311       468.606019012    

只有

的约150多个条目继续进行
Ca              1
     6.421269411        -1.034199034         1.228702751    
  -1.06475894897       1.10274459622       1.31459311620    
  -6319.67959205      -10299.4183311       468.606019012    

段,其中第二行代表x,y和z坐标,我需要通过添加一个轻微的位移来操纵,以及顶行,其中Ca代表原子(在这个例子中,钙)和整数是原子计数器(这是第一个原子,我有一个大约75 CaCO3的系统)。

现在我已经编写了一些读取字符串的java代码,将其粘贴到arrayList中并对其进行标记,并且从那里我非常确定如何添加位移只保留这种奇怪的格式使其复杂化。显然我的目标是作为一般解决方案,因为我可以到达这里,所以我可以重复使用它,同时我确信我可以强制它使用正确的格式,这意味着我只能用它来做到这一点文件。

所以,我的问题是,如何在java中操作文件中的值,保持格式100%完整?在这个系统中,我怎么能告诉它只在每个段的第二行添加位移?

它有点复杂(或者可能不是,我真的不知道),但我真的很感激一些帮助。

所以,我有这样的事情:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
import java.util.ArrayList;
import java.io.FileReader;

public class testArrayReader {
static ArrayList<String> temp = new ArrayList<String>();



public static void main(String[] args) {
    String[] arr = null;
    String[][] twodim = null;
    System.out.println("Array List initialised!");

        try{
            FileReader input = new FileReader(urlfortextfile);
            BufferedReader reader = new BufferedReader(input);
            System.out.println("Scanned!");
            String line;
            int onedimcounter = 0;
            while((line = reader.readLine()) != null){
                temp.add(onedimcounter++, line);
        }

            System.out.println(temp);
            twodim = temp.toArray(new String[temp.size()][temp.get(0).length()]);
            System.out.println("stage 2 complete");
            System.out.println(twodim);
    }
        catch(FileNotFoundException ex){
            System.out.println("No file found boss.");
    }
        catch(IOException ex){
            System.out.println("IO error.");
        }

  }

}

更多查询,

1)[第1行,第2行,......,第n行] - 逗号表示第一行和第二行是单独的元素,对吗?

2)我得到了一个ArrayStoreException并且我真的不是百分之百确定原因 - 文档中提到了关于转换错误的内容,所以我假设我的arraylist项目仍然作为对象被卡住。我该如何解决这个问题?

3)当前的修改计划是在最终数组中列出元素索引,修改和重新打印,但我已逐行对其进行分块以保留格式。需要一些确认我在这里正确的轨道,我的想法是解析双线,做我需要做的,然后尝试让计算机计算数字之间的空格数和替换构建一个字符串,然后我可以重新插入。类似于一个带有if语句的计数器,它基于一些寻找空格的布尔值,然后计数器将插入&#34; &#34;当我连接最后的字符串时。

干杯。

1 个答案:

答案 0 :(得分:0)

首先,将文件解析为具有关联文件位置元数据的值表。

其次,在原子复制/插入/删除单元格/行/列方面实现该表上的所有突变,这也会更新文件位置。

第三,实现一个表序列化运算符,它接收旧内容,以便您可以查找数据行之间和行内单元格之间的空白区域,从而可以推导出数字格式(sig数字的数量)序列化更改的数值时从旧文件。


  

如何查找和解析文件元数据中的位置?

关联位置信息,跟踪

/** Number of line breaks since start of file */
int lineNumber;  
/** Number of chars since start of file */
int charInFile;
/** Number of chars since start of line (if on the zero-th line) or last line break. */
int charInLine;  

然后使用每个标记,关联第一个字符前的位置和标记中最后一个字符后的位置。

解析复杂的构造(如表,表行或表格单元格)时,将其存储在它跨越的第一个标记之前的位置,以及它跨越的最后一个标记之后的位置。


  

什么是表序列化运算符?我知道序列化不是那个

通过运算符,我只是指编程语言的一部分,它允许您指定输入和输出之间的关系。我用它来避免语言特定的术语,如 function method procedure


  

如何在堆栈溢出中输入返回键

请参阅“What is the reason for the top secret two space newline markdown weirdness?