根据第一个单词省略数组中的元素

时间:2015-07-03 22:02:41

标签: java parsing

我在这里要做的是处理日志文件,在我的例子中是鱿鱼的access.log。我想让我的程序看看文件中的第一个“单词”,这是访问URL时Unix格式的时间。在程序的其他部分,我设计了一个时间类,它获取程序在Unix时间上次运行的时间,我想将此时间与文件中的第一个单词进行比较,这恰好是Unix时间。 / p>

我最初的思考是如何处理文件,将其存储在数组中,然后根据文件中的第一个单词,通过从处理文件所在的数组中删除行来省略行,以及把它放在另一个数组

这是我到目前为止所得到的。我很确定我很接近,但这是我第一次完成文件处理,所以我不知道我在做什么。

    private void readFile(File file) throws FileNotFoundException, IOException{
    String[] lines = new String[getLineCount(file)];
    Long unixTime = time.getUnixLastRun();


    String[] removedTime = new String[getLineCount(file)];


    try(BufferedReader br = new BufferedReader(new FileReader(file))) {
        int i = 0;
        for(String line; (line = br.readLine()) != null; i++) {
            lines[i] = line;

        }   
   }

    for(String arr: lines){
        System.out.println(arr);
    }
}

2 个答案:

答案 0 :(得分:1)

private void readFile(File file) {
    List<String> lines = new ArrayList<String>();
    List<String> firstWord = new ArrayList<String>();
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        String sCurrentLine;
        while ((sCurrentLine = br.readLine()) != null) {
            // Adds the entire first line
            lines.add(sCurrentLine);
            // Adds the first word
            firstWord.add(sCurrentLine.split(" ")[0]);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

如果您愿意,可以使用阵列。

答案 1 :(得分:1)

  private void readFile(File file) throws FileNotFoundException, IOException {
        String[] lines = new String[getLineCount(file)];
        Long unixTime = time.getUnixLastRun();

        String[] removedTime = new String[getLineCount(file)];

        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            int i = 0;
            for (String line; (line = br.readLine()) != null; i++) {
                lines[i] = line;
            }
        }

        ArrayList<String> logsToBeUsed = new ArrayList<String>();

        for (String arr : lines) {
             //Gets the first word from the line and compares it with the current unix time, if it is >= unix time
            //then we add it to the list of Strings to be used
            try{
                if(Long.parseLong(getFirstWord(arr)) >= unixTime){
                    logsToBeUsed.add(arr);
                }
            }catch(NumberFormatException nfe){
                //Means the first word was not a float, do something here
            }
        }
    }

    private String getFirstWord(String text) {
        if (text.indexOf(' ') > -1) { 
            return text.substring(0, text.indexOf(' ')); 
        } else {
            return text; 
        }
    }

根据您发布的代码,这是答案。这可以更有效地完成,因为您可以使用ArrayList来存储文件中的行,而不是在打开文件两次时首先读取行号getLineCount(file)。在for循环中,您一次又一次地声明String对象。