在Java文件上执行操作的简便方法?

时间:2016-09-08 07:15:09

标签: java database

我是Java和Java的新手 我试图读取一个文本文件,以便我可以对它进行操作(删除列等)。 考虑一个示例文件

Name,Cats,Dogs
Paul,1,3
Julia,2,4

到目前为止,我使用Scanner来阅读file。要进行操作,我想使用ArrayList

File temp = new File("Path-to-file");
Scanner s;
try{
s=new Scanner(temp);
ArrayList<String> list = new ArrayList<String>();
while(s.hasNextLine()){
list.add(s.nextLine());
}
s.close();
} catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

现在,我可以做一些操作,例如使用remove方法删除一行。但这并不是我想要的。它真的很复杂(对于我来说,作为Java的初学者......)返回例如“Dogs”列。我必须识别列狗的索引,然后遍历所有行。在Java中处理数据是否更简单?

2 个答案:

答案 0 :(得分:1)

要阅读所有行,有一种更新的方法:

Path path = Paths.get("Path-to-file");
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);

这里我指出了文件字节的编码。 UTF-8可以执行所有Unicode,因此是一个合适的选择。然后该文件必须保存为UTF-8。

如果您了解结构并想为该特定主题做一些业务逻辑:

class Person {
    String name;
    int cats;
    int dogs;
}

List<Person> persons = new ArrayList<>();
lines.remove(0); // Remove header line with index 0
for (String line : lines) {
    Person person = new Person();
    String[] parts = line.split(",", 3);
    person.name = parts[0];
    person.cats = Integer.parseInt(parts[1]);
    person.dogs = Integer.parseInt(parts[2]);
    persons.add(person);
}

for (Person person : persons) {
    System.out.printf("%s has %d cats and %d dogs.%n",
            person.name, person.cats, person.dogs);
}

// Java 8 streams (= walk throughs)
persons.stream()
    .filter(pers -> pers.cats == 0)
    .sort((pers1, pers2) -> Integer.compare(pers1.dogs, pers2.dogs))
    .forEach((pers) -> System.out.printf("%s has %d dogs.%n", pers.name, pers.dogs));

否则,您可以使用CSV(逗号分隔值)库并执行类似Excel的操作。

答案 1 :(得分:0)

就像Joop所说,你也可以使用一个图书馆,一个你可以从CsvEngine Library下载并导入你的项目的图书馆。

稍后您必须为您的文件定义一个类...

import fr.ybonnel.csvengine.annotation.CsvColumn;
import fr.ybonnel.csvengine.annotation.CsvFile;

@CsvFile(separator = ",")
class Person {

    @CsvColumn("Name")
    public String name;

    @CsvColumn("Cats")
    public int cats;

    @CsvColumn("Dogs")
    public int dogs;

    // Generate getters and setters ...
}

稍后您必须创建一个类才能读取您的文件...

import java.io.InputStream;
import fr.ybonnel.csvengine.CsvEngine;
import fr.ybonnel.csvengine.exception.CsvErrorsExceededException;

public class CsvReaderExample<T> {

    private static CsvEngine engine;
    private Class<T> clazz;

    public CsvReaderExample(Class<T> clazz) {
        this.clazz = clazz;
        engine = new CsvEngine(clazz);
    }

    public List<T> readObjects(InputStream inputStreamFile) throws CsvErrorsExceededException, IOException {
        return engine.parseInputStream(inputStreamFile, clazz).getObjects();
    }   
}   

然后你称之为......

CsvReaderExample<Person> csvEngine = new CsvReaderExample<>(Person.class);
List<Person> persons = csvEngine.readObjects(YourFileLikeInputStream);

如果您想了解更多如何使用此库。您可以阅读Wiki of the Library