我正在尝试解析具有发行说明并获取特定说明的文本文档。为此,我有一个带有所需发行说明密钥的csv。我想扫描csv并使用每个键找到发行说明的匹配部分,并打印以下说明。
我想使用Scanner类对此进行练习。
csv如下:
foobar-123,foobar-127,foobar-129
发行说明文本文档如下:
foobar-123: ewkjhlq kghlhrekgh
foobar-124: lkjhfgrelgkj nberg
foobar-127: ljdfgl kjwneglkjn fdg
foobar-129: lguwlrkguj gwrlekgj werlktj
我遇到的问题是通过csv进行迭代。我似乎一直在抓住csv中的第一个字符串。我试图弄清楚如何将我的位置保存在csv中,因此每次调用该方法时,它都会转到下一个字符串。
我想我可以创建一个变量,该变量保存最后找到的字符串,然后使用扫描仪找到该变量,然后获取下一个字符串。但这将需要每次我想进行扫描时都通过csv进行扫描,这似乎并不有效。使用Scanner类迭代csv的最佳方法是什么?
这是我到目前为止的代码:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
public class ReleaseNotesScan {
public static void main(String[] args) {
//Open csv file with issue keys
Scanner getIssueKeys = null;
try {
getIssueKeys = new Scanner(new FileReader("resources/Issues.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//Open release notes
Scanner releaseNotes = null;
try {
releaseNotes = new Scanner(new FileReader("resources/Release notes text.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//Get issue key from csv
String issueKey = Finders.issueKey(getIssueKeys);
//The below three lines are just for testing if I am iterating through the csv
System.out.println(issueKey);
Finders.issueKey(getIssueKeys);
System.out.println(issueKey);
//Get issue key and description
String description = Finders.sectionContent(releaseNotes, issueKey);
System.out.println(issueKey + ": " + description);
//Close csv
getIssueKeys.close();
//Close release notes
releaseNotes.close();
}
}
我的Finders类:
import java.util.Scanner;
public class Finders {
//parse csv
public static String issueKey(Scanner findIssues) {
findIssues.useDelimiter(",");
String issue = findIssues.next();
return issue;
}
public static String sectionContent(Scanner releaseNotes, String heading) {
while (releaseNotes.hasNextLine()){
String found = releaseNotes.findInLine(heading);
if (found != null){
releaseNotes.findInLine(": ");
String grabIt = releaseNotes.nextLine();
return grabIt;
}
releaseNotes.nextLine();
}
releaseNotes.close();
return "Not found";
}
}
答案 0 :(得分:0)
这里有一些示例代码来演示如何构建应用程序。我做了一些假设,即输入文件以字符串形式“发出”(为简洁起见,而不是文件)。这些问题存储在数组中,并在Shift
集合中发布说明。从文件中读取发行说明,标记为发行版及其发行说明文本(用分隔符“:”分隔)。问题是关键,发行说明是地图中的值。
最后,迭代每个问题并从地图中获取相应的发行说明。
示例代码:
HashMap
release_notes.txt :
import java.util.*;
import java.io.*;
public class MatchIssues {
private static String [] issues;
private static Map<String,String> releseNotes = new HashMap<>();
public static void main(String [] args)
throws IOException {
getIssues();
getReleaseNotes();
for(String issue : issues) {
// Match release notes for the issue
System.out.println(releseNotes.get(issue));
}
}
private static void getIssues() {
String s = "foobar-123,foobar-127,foobar-129"; // use string for demo
issues = s.split(",");
System.out.println(Arrays.toString(issues));
}
private static void getReleaseNotes()
throws IOException {
BufferedReader reader =
new BufferedReader(new FileReader("release_notes.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
String [] tokens = line.split(":");
releseNotes.put(tokens[0].trim(), tokens[1].trim());
}
System.out.println(releseNotes);
}
}