如何从文件中分割给定的输入?

时间:2013-02-25 16:41:27

标签: java reducers

我编写了用于从文本文件传递整数输入的Java代码,例如1 10 39 59 20 60 38我必须在有空格时拆分字符串。

输入在input.txt

的单行中给出

我的代码是:

public void reduce(Text key, Iterator<IntWritable> values,
        OutputCollector<Text, IntWritable> output, Reporter reporter)
        throws IOException {

    String calc;
    calc = key.toString();

    ArrayList<Integer> keys = new ArrayList<Integer>();
    String[] data = calc.split(" ");

    for (String s : data) {
        int intData = Integer.parseInt(s);
        keys.add(intData);
    }

    int val = 0;
    for (int a : keys) {
        // some tasks
    }
}

分割线后,我使用不同任务的分隔值。我的问题是如何拆分位于同一文件中的所有值(值也在不同的行中)并将它们存储在数组中?

假设以下是input.txt中给出的输入,如何拆分所有值并将它们存储在数组中?

示例输入:

1 4 92 58 30 82
49 50 38 30 29 20
...

预期输出:

array1="1,4,92,58,30,82,49,50,38,30,29,20, .."

当我将代码用于上述输入时,只考虑输入文件的最后一行 - 所有前面的行都被忽略了。

5 个答案:

答案 0 :(得分:1)

如果类路径中有commons-io-x.x,则可以尝试以下代码。我用commons-io-2.4进行演示。此外,我在这里假设输入为String,您可以使用Integer.parseInt(String str)从输入文件中获取整数值。

package com.stack.overflow.works.service;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.io.FileUtils;

/**
 * 
 * @author sarath_sivan
 *
 */

public class FileIOService {

    private static final String BLANK_SPACE = " ";

    public static void main(String[] args) {
        FileIOService.run();
    }

    public static void run() {
        long startTime = System.currentTimeMillis();
        String fileName = "C:/Users/sarath_sivan/Desktop/input.txt";
        FileIOService.display(split(getContent(fileName)));
        long stopTime = System.currentTimeMillis();
        long elapsedTime = stopTime - startTime;
        System.out.println("Total Time: "+ elapsedTime + " Milliseconds...");
    }

    public static void display(List<String> splitsList) {
        for (String split: splitsList) {
            System.out.println(split);
        }
    }

    public static List<String> split(String content) {
        List<String> splitsList = new ArrayList<String>(Arrays.asList(content.split(BLANK_SPACE)));
        return splitsList;
    }

    public static String getContent(String fileName) {
        File file = new File(fileName);
        String content = null;
        try {
            content = FileUtils.readFileToString(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return content;
    }

}

希望这会有所帮助...... 非常感谢你!

答案 1 :(得分:0)

这是纯粹的推测,但似乎这些行是罪魁祸首:

ArrayList<Integer> keys = new ArrayList<Integer>();
            String [] data = calc.split(" ");

我假设您在for循环中调用此方法,这当然只会为您提供最后一个处理过的行。你需要做的是在函数之外声明keys,这样就不会在每次调用周围函数时重新实现它。

答案 2 :(得分:0)

您还可以检查calc字符串,我的猜测是它只包含一行,然后您必须检查

key.toString()

方法

此外,使用java 1.7,您可以使用

初始化ArrayList
ArrayList<Integer> keys = new ArrayList<>();

答案 3 :(得分:0)

您似乎没有在Text key参数中连接文件的所有行。

我想您可以使用Apache FileUtils在单个字符串var(http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#readFileToString(java.io.File))中读取您的文件

答案 4 :(得分:0)

当您正在读取文件时,您基本上调用了readLine()方法,该方法将为您提供包含当前行数据的字符串。但是在你的情况下会发生什么,当你在文件的末尾时,将读取一个字符串,该字符串将被拆分并分配给字符串数组。所以这里你以前的价值观会丢失。因此,为了避免这种情况,您必须使用一个临时数组来存储当前结果,然后将该结果添加到结果数组中。

String[] mainArray=new Array[255]; // 255 for example

String temp;

while((temp=br.readLine()!=null))
{

String[] tempArr=temp.split(" ");
addToMainArray(tempArr);

}

希望这有帮助。