将文本文件分成块
dividing the text files in block
我正在尝试读取文本文件并将其分成块。以下是输入文本文件的格式:
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 的每个值都是一个作业定义,即从 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 天一直停留在这个问题上。帮助将不胜感激。
如果您需要更多说明,请告诉我。
谢谢
我认为这是因为你将 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");
}
希望对您有所帮助。
我正在尝试读取文本文件并将其分成块。以下是输入文本文件的格式:
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 的每个值都是一个作业定义,即从 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 天一直停留在这个问题上。帮助将不胜感激。
如果您需要更多说明,请告诉我。
谢谢
我认为这是因为你将 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");
}
希望对您有所帮助。