在Java中从.txt文件中拆分String的简单方法

时间:2015-05-09 18:59:42

标签: java io integer

这是我创建的代码。它按照我想要的方式工作,但我认为它可以更简单。

File test = new File("test.txt");

try{
    Scanner input = new Scanner(test);

    int[] testInt= new int[100];
    String[] test= new String[100];
    String[] print= new String[100];
    int i= 0;

    while(input.hasNextLine()){
        test[i] = input.nextLine();
        String[] temp = test[i].split(":");
        testInt[i] = Integer.parseInt(temp[1]);
        print[i] = temp[0];
        i++;
    }

    for(int j=0; j<i; j++)
        System.out.println(print[j] + ":" + testInt[j]);

} catch (FileNotFoundException ex){
    System.out.println("File not found!");
}

以下是&#34; test.txt&#34;的内容:

Telur Dadar:40
Maggi Goreng:50

所需的输出类似于test.txt中的内容,只是整数值以int数据类型存储。不知何故,我认为有一种方法可以使用nextInt()和分隔符等。 我尝试过使用nextInt()和一些客户分隔符,但我得到的却是很多错误。

有任何建议怎么做?

4 个答案:

答案 0 :(得分:2)

您可以使用Java 8功能执行此操作,如下所示

package example;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class SplitFile {

    public static void main(String[] args) throws IOException {
        List<Integer> numbers = new ArrayList<Integer>();
        List<String> names = new ArrayList<String>();

        try (Stream<String> stream = Files.lines(Paths.get("test.txt"))) {
            stream.forEach(s -> {
                names.add(s.split(":")[0]);
                numbers.add(Integer.parseInt((s.split(":"))[1].trim()));
            });
        }

        IntStream.range(0, Math.min(names.size(), numbers.size()))
                .mapToObj(i -> names.get(i) + ":" + numbers.get(i))
                .forEach(System.out::println);
    }

}

输出:

Telur Dadar:40
Maggi Goreng:50

答案 1 :(得分:0)

我建议你从一个例程开始,用正则表达式计算匹配行的数量。另外,您应该close Scanner读取文件(因此您不会泄漏文件句柄)。最简单的可能是try-with-resources和类似&#34; ^ \ D +:\ d +&#34;它匹配连续的字母字符,然后是:,然后是连续的数字,如

public static int countLines(File f) {
    int c = 0;
    try (Scanner s = new Scanner(f)) {
        while (s.hasNextLine()) {
            String line = s.nextLine();
            if (line.matches("^\\D+:\\d+")) {
                c++;
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return c;
}

然后,您可以创建一个例程来填充数组(使用您的行Scanner),如

public static void readLines(File f, int[] nums, String[] vals) {
    int c = 0;
    try (Scanner s = new Scanner(f)) {
        while (s.hasNextLine()) {
            String line = s.nextLine();
            if (line.matches("^\\D+:\\d+")) {
                Scanner input = new Scanner(line).useDelimiter(":");
                vals[c] = input.next();
                nums[c] = input.nextInt();
                c++;
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

最后,您的main方法可能如下(假设test.txt位于用户的主文件夹中),我还建议使用printf格式化io并重命名变量printtestIntvalsnums赞,

public static void main(String[] args) {
    File test = new File(System.getProperty("user.home"), "test.txt");
    int lineCount = countLines(test);
    int[] nums = new int[lineCount];
    String[] vals = new String[lineCount];
    readLines(test, nums, vals);
    for (int j = 0; j < lineCount; j++) {
        System.out.printf("%s:%d%n", vals[j], nums[j]);
    }
}

我得到了

Telur Dadar:40
Maggi Goreng:50

答案 2 :(得分:0)

以下是使用地图删除数组的方法。这将根据您的数据自动调整大小。

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication2;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.HashMap; 
import java.util.Map; 
import java.util.stream.Stream;
import java.nio.file.Files;
import java.nio.file.Paths;
/**
 *
 * @author dciborow
 */
public class JavaApplication2 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        String file = "";        
        try (Stream<String> stream = Files.lines(Paths.get("test.txt"))) {
            stream.forEach(s -> {
                String[] split = s.split(":");
                map.put(split[0], Integer.parseInt(split[1]));
            });
        } catch (IOException ex) {
            Logger.getLogger(JavaApplication2.class.getName()).log(Level.SEVERE, null, ex);
        }

        map.keySet().stream().forEach(s -> System.out.println(s + ": " + map.get(s)));
    }
}

答案 3 :(得分:0)

使用java8的简短测试解决方案

Path path = Paths.get(ClassLoader.getSystemResource("file.txt").toURI());

        Map<String, Integer> collect = Files.lines(path)
                .map(line -> line.split(":"))
                .collect(Collectors.toMap(lineArray -> lineArray[0], lineArray -> Integer.parseInt(lineArray[1])));

您可以使用任何提供字符串流(行)的方法代替Files.lines(path)map操作将行转换为String [](第一项=名称,secont项目=数字)。收集使用toMap collector,需要两个函数 - 一个用于键,一个用于值。收集器使用上一步中的String []。