我是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中处理数据是否更简单?
答案 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