在csv上使用Scanner,在每次方法调用时进行迭代

时间:2018-07-26 01:18:46

标签: java csv parsing java.util.scanner

我正在尝试解析具有发行说明并获取特定说明的文本文档。为此,我有一个带有所需发行说明密钥的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";
    }
}

1 个答案:

答案 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);
    }
}