将块中的文本文件分开

时间:2015-06-07 04:10:41

标签: java collections

我正在尝试读取文本文件并将其分成块。下面是输入文本文件的模式:

DEFINE JOBSET ID=jobset_def FAILCOND=(1,9999)

DEFINE JOB ID=(jobset_def,job1_def,0010) 
DESCRIPTION='Checks the data file against the token file'
DEFINE JOBPARM ID=(jobset_def,job1_def,0010) SUBFILE=/scripts/chk_file.ksh SUBUSER=pbods SUBPASS=*PASSWORD*
PARM1='parm1'
PARM2='parm2.dat'

DEFINE JOB ID=(jobset_def,job2_def,0030)  
DEFINE JOBPARM ID=(jobset_def,job2_def,0030)
SUBFILE='exec_sess_instance.ksh' SUBUSER=pbods SUBPASS=*PASSWORD*
PARM1='parm1'
PARM2='parm2'
.......

我想将文本文件分成更小的块并将其存储到HashMap中。 HashMap的每个值都是Job defination,即从 DEFINE JOB ID 到下一个 DEFINE JOB ID 。以下是我的代码:

public class UpdateJobs {
    public static void main(String[] args) throws IOException {
    File file = new File("H:/Project_Documents/ALM/ns_pbds_gwm_uscore_account_omx.txt");
    FileReader fileReader = new FileReader(file);
    HashMap <Integer, StringBuffer> jobdef= new HashMap <Integer, StringBuffer>();
    int i=1;
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    StringBuffer stringBuffer = new StringBuffer();
    Iterator<Integer> keySetIterator = jobdef.keySet().iterator();
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        if (line.contains("DEFINE JOB ID")){
            jobdef.put(i, stringBuffer);
            i++;
            stringBuffer.setLength(0);
        }
        stringBuffer.append(line);
        //System.out.println("Line is" +line);
        stringBuffer.append("\n");
    }
    fileReader.close();
    while(keySetIterator.hasNext()){
          Integer key = keySetIterator.next();
          System.out.println("key: " + key + " value: " + jobdef.get(key));
            }           
    }
}

我遇到的问题是我没有得到任何输出。代码运行没有任何错误,但问题是每次进入第一个while循环时它在hashmap中创建一个条目,在下一个条目中它覆盖前一个条目并创建一个新条目,即

Loop1: 
key, value
1, DEFINE JOBSET ID=jobset_def FAILCOND=(1,9999)

DEFINE JOB ID=(jobset_def,job1_def,0010) 
DESCRIPTION='Checks the data file against the token file'
DEFINE JOBPARM ID=(jobset_def,job1_def,0010) SUBFILE=/scripts/chk_file.ksh SUBUSER=pbods SUBPASS=*PASSWORD*
PARM1='parm1'
PARM2='parm2.dat'

Loop2:
key, value
1,DEFINE JOB ID=(jobset_def,job2_def,0030)  
DEFINE JOBPARM ID=(jobset_def,job2_def,0030)
SUBFILE='exec_sess_instance.ksh' SUBUSER=pbods SUBPASS=*PASSWORD*
PARM1='parm1'
PARM2='parm2'

2,DEFINE JOB ID=(jobset_def,job2_def,0030)  
DEFINE JOBPARM ID=(jobset_def,job2_def,0030)
SUBFILE='exec_sess_instance.ksh' SUBUSER=pbods SUBPASS=*PASSWORD*
PARM1='parm1'
PARM2='parm2'
....

并且在循环结束时它在第二个while循环中不打印任何内容,即它删除HashMap中的所有条目。

我无法调试它并在过去2天内坚持这一点。将不胜感激。

如果您需要更多说明,请与我们联系。

由于

1 个答案:

答案 0 :(得分:1)

我认为这是因为您将StringBuffer对象本身作为值放入HashMap,并且因为它是Object,所以代码指向内存中的相同区域随时随地你访问它。这意味着当您将stringBuffer放入HashMap并随后更改其内容时,HashMap内的内容也会发生变化。

快速解决方法是在每次读取行中的“DEFINE JOB ID”时实例化new StringBuffer()对象。

这意味着改变这个:

    StringBuffer stringBuffer = new StringBuffer();
    Iterator<Integer> keySetIterator = jobdef.keySet().iterator();
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        if (line.contains("DEFINE JOB ID")){
            jobdef.put(i, stringBuffer);
            i++;
            stringBuffer.setLength(0);
        }
        stringBuffer.append(line);
        //System.out.println("Line is" +line);
        stringBuffer.append("\n");
    }

对此:

    StringBuffer stringBuffer = new StringBuffer();
    Iterator<Integer> keySetIterator = jobdef.keySet().iterator();
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        if (line.contains("DEFINE JOB ID")){
            stringBuffer = new StringBuffer();
            jobdef.put(i, stringBuffer);
            i++;
            stringBuffer.setLength(0);
        }
        stringBuffer.append(line);
        //System.out.println("Line is" +line);
        stringBuffer.append("\n");
    }

希望这有帮助。