我试图从csv text file中读取一个表,并用java生成一个表(Hashmap中的List个).

为此,我读取文本文件的每个line,从line中构造一个Hashmap<String, String>记录,并在每次迭代结束时将其附加到ArrayList.

我希望文本文件中每一行的一个实例在列表中只出现一次,但得到的只是文本文件中出现n+1次的最后一行,n是最后一行号.

代码如下:

public static void main(String[] args) throws IOException {
    
    FileReader filObj = null;
    try {
        filObj = new FileReader(new File(System.getProperty("user.home") + "\\Desktop\\testData.txt"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    
    BufferedReader br = new BufferedReader(filObj);
    
    List<String> headers = new ArrayList<String>();
    List<HashMap<String, String>> myTable = new ArrayList<HashMap<String, String>>();
    HashMap<String, String> myRecord = new HashMap<String, String>();
    
    String line = null;
    int ext = 0;
    while ((line = br.readLine()) != null) {
        //System.out.println(line);
        if (ext == 0) {
            headers = Arrays.asList(line.split(","));
        } else {
            int index = 0;
            for (String each : line.split(",")) {
                myRecord.put(headers.get(index), each);
                index++;
            }
            System.out.println("myrecord:" + myRecord);
        }
        myTable.add(myRecord);
        ext++;
        System.out.println("My Table:" + myTable);
    }
}

testData.txt个文件内容如下

TransactionNumber,TransactionType,Amount,TransactionDate,TransactionRemarks
123456,Credit,4000,07/10/2021,Salary Credited
123333,Debit,7000,05/10/2021,Fuel
123446,Credit,3000,01/10/2021,Refund

控制台输出如下:

My Table:[{}]
myrecord:{TransactionType=Credit, TransactionNumber=123456, Amount=4000, TransactionRemarks=Salary Credited, TransactionDate=07/10/2021}
My Table:[{TransactionType=Credit, TransactionNumber=123456, Amount=4000, TransactionRemarks=Salary Credited, TransactionDate=07/10/2021}, {TransactionType=Credit, TransactionNumber=123456, Amount=4000, TransactionRemarks=Salary Credited, TransactionDate=07/10/2021}]
myrecord:{TransactionType=Debit, TransactionNumber=123333, Amount=7000, TransactionRemarks=Fuel, TransactionDate=05/10/2021}
My Table:[{TransactionType=Debit, TransactionNumber=123333, Amount=7000, TransactionRemarks=Fuel, TransactionDate=05/10/2021}, {TransactionType=Debit, TransactionNumber=123333, Amount=7000, TransactionRemarks=Fuel, TransactionDate=05/10/2021}, {TransactionType=Debit, TransactionNumber=123333, Amount=7000, TransactionRemarks=Fuel, TransactionDate=05/10/2021}]
myrecord:{TransactionType=Credit, TransactionNumber=123446, Amount=3000, TransactionRemarks=Refund, TransactionDate=01/10/2021}
My Table:[{TransactionType=Credit, TransactionNumber=123446, Amount=3000, TransactionRemarks=Refund, TransactionDate=01/10/2021}, {TransactionType=Credit, TransactionNumber=123446, Amount=3000, TransactionRemarks=Refund, TransactionDate=01/10/2021}, {TransactionType=Credit, TransactionNumber=123446, Amount=3000, TransactionRemarks=Refund, TransactionDate=01/10/2021}, {TransactionType=Credit, TransactionNumber=123446, Amount=3000, TransactionRemarks=Refund, TransactionDate=01/10/2021}]

推荐答案

在每个迭代步骤中,将mapsame个实例添加到list个实例中.这map被添加到listn + 1次,因为第myTable.add(myRecord);行是在读取标题后执行的(我想这不是您的意图).

相反,您需要将 map 的创建移动到while循环中,为每行文本实例化new map.

代码中几乎没有其他问题:

您的代码可能会这样重写:

public static void main(String[] args) {
    
    List<Map<String, String>> myTable = new ArrayList<>();
    
    try (var reader = new BufferedReader(new FileReader(System.getProperty("user.home") + "\\Desktop\\testData.txt"))) {
        List<String> headers = new ArrayList<>();
        
        String line = null;
        int ext = 0;

        while ((line = reader.readLine()) != null) {
            //System.out.println(line);
            if (ext == 0) {
                headers = Arrays.asList(line.split(","));
                ext++;
                continue;
            }
            
            Map<String, String> myRecord = new HashMap<>();

            int index = 0;
            for (String each : line.split(",")) {
                myRecord.put(headers.get(index), each);
                index++;
            }
            
            myTable.add(myRecord);
            ext++;

            System.out.println("myrecord:" + myRecord);
            System.out.println("My Table:" + myTable);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Java相关问答推荐

具有额外列的Hibert多对多关系在添加关系时返回NonUniqueHealthExcellent

强制Mockito返回null而不是emtpy list

Character::Emoji不支持带数字的字符吗?

路径映射未发生

将数组整体转换为链接表

使用Testcontainers与OpenLiberty Server进行集成测试会抛出SocketException

使用REST客户端和对象映射器从字符串反序列化Json

使用Mockito进行的Junit测试失败

Spring data JPA/Hibernate根据id获取一个列值

如何从JNI方法正确调用NSOpenPanel以在正确的线程上运行?

如何在Spring Java中从数据库列中获取JSON中的具体数据

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

如何在不删除Java中已有内容的情况下覆盖文件内容?

垃圾回收器是否真的删除超出作用域的对象?

如何用内置Java从JavaFX应用程序中生成.exe文件?

JavaFX:无论何时显示应用程序,如何更改组件/ node 位置?

在Java中使用StorageReference将数据从Firebase存储添加到数组列表

JavaFX:为什么我的ComboBox添加了一个不必要的单元格的一部分?

如何修复Spring Boot应用程序中的RestDocumentationGenerationException:java.io.FileNotFoundException:/curl-request.adoc(只读文件系统)?

如何使用命令行为Java应用程序生成烟雾测试用例