RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1401211
Accepted
Владимир
Владимир
Asked:2022-06-18 01:42:58 +0000 UTC2022-06-18 01:42:58 +0000 UTC 2022-06-18 01:42:58 +0000 UTC

如何访问.csv文件中的列值?

  • 772

作业说:当处理已知格式的字符串时,使用 split() 方法很方便。它在分隔符处拆分原始字符串并返回一个字符串数组。例如,要分割我们的行,我们需要从文件中逐行调用带有 System.lineSeparator() 参数的方法。此函数返回字符串的结尾:

String[] lines = fileContents.split(System.lineSeparator());

现在我们有一组字符串。仍然需要使用相同的方法拆卸它们中的每一个。除法将在符号“,”上进行:

String[] lineContents = line.split(",");

这将允许您引用字符串中的特定值。

现在问题本身:

如何在我的代码中使用所有这些来访问xxx.csv文件中的值以进一步使用它们(例如,获取 sum_of_one 列的总和)?:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {
    public static void main(String[] args) {
        System.out.println(readFileContents("xxx.csv"));
    }

    private static String readFileContents(String filename){
    Path filePath = Paths.get(filename);
    try {
        return Files.readString(filePath);
        } catch (IOException e) {
            System.out.println("Невозможно прочитать файл. Возможно, файл не находится в нужной директории.");
        }
    }
}

xxx.csv

item_name,is_expense,quantity,sum_of_one
Коньки,TRUE,50,2000
Новогодняя ёлка,TRUE,1,100000
Ларёк с кофе,TRUE,3,50000
Аренда коньков,FALSE,1000,180
Продажа билетов,FALSE,3500,300
Продажа кофе,FALSE,2421,150
java
  • 2 2 个回答
  • 199 Views

2 个回答

  • Voted
  1. siarhei987
    2022-06-18T22:58:47Z2022-06-18T22:58:47Z

    如果您不需要爬入 OOP,我将提供此选项。

    每行的值都是在循环中获得的for。在此示例имя=значиние中,显示所有对。

    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    
    public class Main {
    
        private static final int ITEM_NAME = 0;
        private static final int IS_EXPENSE = 1;
        private static final int QUANTITY = 2;
        private static final int SUM_OF_ONE = 3;
    
        public static void main(String[] args) throws IOException {
    
            String[] lines = Files
                    .readString(Paths.get("file.csv"))
                    .split(System.lineSeparator());
    
            for (int i = 1; i < lines.length; i++) {
    
                String[] values = lines[i].split(",");
    
                String name = values[ITEM_NAME];
                boolean isExpense = Boolean.parseBoolean(values[IS_EXPENSE]);
                int quantity = Integer.parseInt(values[QUANTITY]);
                int sumOfOne = Integer.parseInt(values[SUM_OF_ONE]);
    
                System.out.printf("{name=%s,isExpense=%s,quantity=%s,sumOfOne=%s\n",
                        name, isExpense, quantity, sumOfOne);
            }
    
        }
    
    }
    
    • 2
  2. Best Answer
    Дмитрий
    2022-06-18T04:15:10Z2022-06-18T04:15:10Z

    您在没有考虑解决方案的情况下完成任务。您的任务不是将文本文件转换为字符串变量。那么问题来了:为什么要编写最终会导致你走向死胡同的代码?毕竟,最初很明显,您不需要生成的 String 类型变量,用它做任何事情要么是不可能的,要么是极其困难的。

    首先,我们需要将 csv 文件转换为便于我们在 OOP 世界中使用的格式。在我看来,任何“表”数据总是可以绘制到 Map 中,其中键是列的名称,值是该表特定行的值。任何csv都可以看成表格数据:有表头,有分隔符,其实就是表格的竖线等。所以我们需要一些能够读取我们的 csv 并将其带到 Map 的东西。这是第一步。现在我们面临另一个问题:地图在使用的普遍性方面是一个很好的解决方案。但是在强类型和 OOP 的世界里,处理这样的数据仍然相当困难,所以我想要一个模型类来接受来自 Map 的数据,它的字段将是强类型的,因此很容易使用此类的实例。因此,下一步是创建模型类。最后一个是将 Map 转换为此类的对象。

    现在实现:

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    public class Parser {
    
        private final String delimeter;
    
        public Parser(String delimeter) {
            this.delimeter = delimeter;
        }
    
        public <T> List<T> load(InputStream is, Class<T> modelClass) throws Exception {
            final List<String> rows = new BufferedReader(new InputStreamReader(is, Charset.defaultCharset()))
                    .lines().collect(Collectors.toList());
            if (rows.size() < 2) {
                return new ArrayList<>();
            }
            final String[] columnsNames = rows.remove(0).split(delimeter);
            final List<T> valuesList = new ArrayList<>(rows.size());
            for (final String v : rows) {
                final String[] value = v.split(delimeter);
                final Map<String, String> values = new HashMap(value.length);
                for (int i = 0; i < value.length; i++) values.put(columnsNames[i], value[i]);
                final T t = modelClass.getDeclaredConstructor(Map.class).newInstance(values);
                valuesList.add(t);
            }
            return valuesList;
        }
    
    }
    
    
    import java.util.Map;
    
    public class Item {
    
        private final String name;
        private final Boolean isExpense;
        private final Integer quantity;
        private final Integer sumOfOne;
    
        public Item(Map<String, String> values) {
            this.name = values.get("item_name");
            this.isExpense = Boolean.valueOf(values.get("is_expense"));
            this.quantity = Integer.valueOf(values.get("quantity"));
            this.sumOfOne = Integer.valueOf(values.get("sum_of_one"));
        }
    
        public String getName() {
            return name;
        }
    
        public Boolean getIsExpense() {
            return isExpense;
        }
    
        public Integer getQuantity() {
            return quantity;
        }
    
        public Integer getSumOfOne() {
            return sumOfOne;
        }
    
        @Override
        public String toString() {
            return "Item{" + "name=" + name + ", isExpense=" + isExpense + ", quantity=" + quantity + ", sumOfOne=" + sumOfOne + '}';
        }
        
    }
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.util.List;
    
    public class Main {
        
        public static void main(String[] args) throws Exception {
            Parser parser = new Parser(",");
            List <Item> items = parser.load(new FileInputStream(new File("xxx.csv")), Item.class);
            System.out.println(items);
            
            int quantitySum = items.stream().mapToInt(Item::getQuantity).sum();
            int sum = items.stream().mapToInt(Item::getSumOfOne).sum();
            System.out.println(quantitySum);
            System.out.println(sum);
        }
    
    }
    
    • 1

相关问题

  • wpcap 找不到指定的模块

  • 如何以编程方式从桌面应用程序打开 HTML 页面?

  • Android Studio 中的 R.java 文件在哪里?

  • HashMap 初始化

  • 如何使用 lambda 表达式通过增加与原点的距离来对点进行排序?

  • 最大化窗口时如何调整元素大小?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5