如何在 Java 中合并 CSV 文件

2023-12-12

我的第一个 CSV 文件看起来像这样,包含标题(标题仅包含在顶部,而不包含在每个条目之后):

NAME,SURNAME,AGE
Fred,Krueger,Unknown
.... n records

我的第二个文件可能如下所示:

NAME,MIDDLENAME,SURNAME,AGE
Jason,Noname,Scarry,16
.... n records with this header template

合并的文件应如下所示:

NAME,SURNAME,AGE,MIDDLENAME
Fred,Krueger,Unknown,
Jason,Scarry,16,Noname
....

基本上,如果标题不匹配,则应根据该顺序在原始标题及其值之后添加所有新标题标题(列)。

Update

上面的 CSV 变小了,这样我就可以说明我想要实现的目标,实际上 CSV 文件是在此之前一步生成的(合并),最多可以有 100 列

我怎样才能做到这一点?


我将创建一个“更大”格式的模型(一个具有四个字段的简单类和一个此类实例的集合)并实现两个解析器,一个用于第一个模型,一个用于第二个模型。为两个 csv 文件的所有行创建记录,并实现编写器以正确的格式输出 csv。简单来说:

 public void convert(File output, File...input) {

   List<Record> records = new ArrayList<Record>();
   for (File file:input) {
     if (input.isThreeColumnFormat()) {
        records.addAll(ThreeColumnFormatParser.parse(file));
     } else {
        records.addAll(FourColumnFormatParser.parse(file));
     }
   }
   CsvWriter.write(output, records);
 }

从您的评论中我看到,您有很多不同的 csv 格式和一些常见的列。

您可以为各种 csv 文件中的任何行定义模型,如下所示:

public class Record {
  Object id; // some sort of unique identifier
  Map<String, String> values; // all key/values of a single row
  public Record(Object id) {this.id=id;}
  public void put(String key, String value){
    values.put(key, value);
  }
  public void get(String key) {
    values.get(key);
  }
}

为了解析任何文件,您将首先读取标题并将列标题添加到全局密钥库(稍后将需要输出),然后为所有行创建记录,例如:

//...
List<Record> records = new ArrayList<Record>()

for (File file:getAllFiles()) {
  List<String> keys = getColumnsHeaders(file);
  KeyStore.addAll(keys);  // the store is a Set
  for (String line:file.getLines()) {
    String[] values = line.split(DELIMITER);
    Record record = new Record(file.getName()+i);  // as an example for id
    for (int i = 0; i < values.length; i++) {
      record.put(keys.get(i), values[i]);
    }
    records.add(record);
  }
}
// ...

现在密钥库具有所有使用的列标题名称,我们可以迭代所有记录的集合,获取所有键的所有值(并获取null如果该记录的文件未使用密钥),则组装 csv 行并将所有内容写入新文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Java 中合并 CSV 文件 的相关文章

  • Java中RandomAccessFile的并发

    我正在创建一个RandomAccessFile对象通过多个线程写入文件 在 SSD 上 每个线程都尝试在文件中的特定位置写入直接字节缓冲区 并且我确保线程写入的位置不会与另一个线程重叠 file getChannel write buffe
  • 检查发送到网页的请求数

    我正在编写一个 Java 多线程应用程序 它可以访问不同 Web 服务器的数百万个 有时甚至数十亿个 URL 这个想法是检查这些 URL 是否给出有效的 200OK 响应或 404 其他代码 我如何知道我的程序是否不会在他们的服务器上造成高
  • RxJava + Retrofit 2 的正确使用方法

    我有这样的 JSON success true data id 29 name u0420 u0435 u0441 u0442 u043e u0440 u0430 u0446 u0456 u044f u0411 u0430 u0447 u0
  • 如何实现具有LinkedHashMap类似功能的ConcurrentHashMap?

    我用过LinkedHashMap with accessOrdertrue 并同时允许最多 500 个条目作为数据的 LRU 缓存 但由于可扩展性问题 我想转向一些线程安全的替代方案 ConcurrentHashMap在这方面似乎不错 但缺
  • Spring boot 2.0.5.RELEASE和mongo 4.0连接问题

    我正在关注使用 MongoDB 访问数据教程春季网站 https spring io guides gs accessing data mongodb 我将 Mongo DB 服务器版本 4 安装为服务当我使用客户端连接到它时 它的身份验证
  • 如何在Spring Boot中初始化一次MongoClient并使用它的方法?

    您好 我正在尝试导出MongoClient在 Spring Boot 中成功连接后 我尝试在其他文件中使用它 这样我就不必每次需要在 MongoDB 数据库中进行更改时都调用该连接 连接非常简单 但目标是将应用程序连接到我的数据库一次 然后
  • 如何将抽象工厂与单例模式结合起来? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在用 java 编码 并且对这些模式很陌生 谁能给我一个也使用单例的工厂抽象的例子 这是一个实现类的示例单例模式 这个实现也是线程安全
  • AffineTransform.rotate() - 如何同时缩放、旋转和缩放?

    我有以下代码 它可以完成我想要绘制一个上面有一些棋子的棋盘的 第一部分 Image pieceImage getImage currentPiece int pieceHeight pieceImage getHeight null dou
  • 如何在Java中打印保留2位小数的浮点数?

    我可以用System out print 您可以使用printf http java sun com j2se 1 5 0 docs api java io PrintStream html printf 28java lang Strin
  • 为什么下面代码的输出是Thread[main,5,main]

    public class test1 public static void main String args TODO Auto generated method stub Thread t Thread currentThread Sys
  • 为什么我要使用责任链而不是 switch 语句

    考虑一下您已经获得了多次验证 仅当要检查的对象属于某种类型时 这些验证才应生效 为什么我要使用责任链而不是 switch 语句 责任链示例 public class Executor Inject private ValidatorFact
  • 反应式 Spring Webflux REST 控制器内部重定向

    我正在为 spring 反应项目创建简单的控制器服务器 在设置重定向到另一个位置时 我在调用时发现错误http localhost 8080 There was an unexpected error type Internal Serve
  • Java字符串查找和替换的最佳方法?

    我正在寻找 Java 中字符串查找和替换的最佳方法 这是一句话 我的名字叫米兰 人们都知道我叫米兰瓦西奇 我想用 Milan Vasic 替换 Milan 弦 但在我已经有 Milan Vasic 的地方 情况不应该是这样 搜索 替换后的结
  • 如何列出hadoop hdfs中目录及其子目录中的所有文件

    我在 hdfs 中有一个文件夹 其中有两个子文件夹 每个子文件夹大约有 30 个子文件夹 最后 每个子文件夹都包含 xml 文件 我想列出所有 xml 文件 仅给出主文件夹的路径 在本地我可以这样做apache commons io 的 h
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr
  • Java 验证日期为 yyyyMMddHHmmss

    我想在java中验证给定的日期格式为yyyyMMddHHmmss 状况 应符合格式 yyyyMMddHHmmss 它应该验证当前日期 它应该验证与当前小时有 3 小时或 3 小时差异的小时数 如果满足所有三个条件 Java 方法应返回 tr
  • 更新分页。是否可以?

    他们是否存在一些方法来处理更新分页 例如我有 100 行类型 Id private Integer id Column private boolean flag Column private Date last 一开始它们看起来像 id f
  • 如何使 JScrollPane 与嵌套 JPanel 一起正常工作?

    我正在使用 NetBeans 在 Java 中构建 Swing 应用程序 但我遇到布局问题 我的主框架包含一个JScrollPane其中包含一个JPanel called contentPanel其中又包含一个JPanel called l
  • Struts2中的变量声明

    Struts2中如何声明变量并为该变量赋值 使用设置标签
  • 使用正则表达式匹配阿拉伯文文本

    我试图使用正则表达式仅匹配阿拉伯语文本 但出现异常 这是我的代码 txt matches P Arabic 这是例外情况 线程 main 中的异常 java util regex PatternSyntaxException 索引 9 附近

随机推荐

  • 有没有办法让 Behat 不会因 PHP 通知错误而失败?

    我知道最好的做法是定义所有变量并在评估之前检查数组索引 但是 我正在尝试对在一些尚未以这种方式编码的遗留代码之上开发的新功能运行一些测试 Behat 失败并显示以下消息 Scenario Add a new resource feature
  • var fn = function() {...} 和 var fn = function foo() {...} 有不同吗?

    当您将函数分配给变量时 如果使用命名函数而不是匿名函数 这有什么区别吗 以下生成错误 foo 未定义 var fn function foo foo 谁能澄清这里发生了什么事吗 你正在创建一个命名函数表达式 IE 中除外 该名称仅在函数内部
  • JSP - 在 JSP 页面之间传递参数

    如何使用纯 Java 代码在 JSP 页面之间传递参数 IE 我不想使用如下代码
  • 如何在Polars中按数据类型选择列?

    在 pandas 中我们有pandas DataFrame select dtypes根据选择某些列的方法dtype 在 Polars 中是否有类似的方法来做这样的事情 可以将数据类型传递给pl col import polars as p
  • 如何多行匹配两个字符串之间的所有文本

    我正在努力完成与所见相同的事情here 即假设您有如下文本 p something p p class sdf some text p p some other text p p The end p 匹配的正则表达式是什么 p class
  • 如何将 NodeJS 与 Angular 连接(在 Nginx 中)

    我有一个带有 Angular 和 NodeJS 的存储库 我在詹金斯中表现 install globally npm install g bower npm install g gulp install bower install npm
  • 如何在 VB 6 中获取当前 CPU 和 RAM 使用情况?

    如何获取VB 6代码中的CPU和内存使用情况 谢谢 确定当前机器上的CPU使用率
  • 从文本文件读取数据并创建对象

    我需要一些帮助 我正在 Java 上进行超市模拟 但我遇到了一个问题 我有一个文本文件 Stock txt 其中包含超市的所有库存 例如 0 面包店 巧克力蛋糕 12 5 250 1 肉 优质牛排 2 6 120 2 海鲜 金枪鱼 1 2
  • Java两次之间的差异[重复]

    这个问题在这里已经有答案了 可能的重复 计算两个 Java 日期实例之间的差异 时间 1 17 05 时间 2 17 08 我想在几秒钟内得到差异 long diffInMillis newerDate getTime olderDate
  • 在 Pig 中提取 CSV 文件的第一行

    我有几个 CSV 文件 标题始终是文件中的第一行 在 Pig 中将该行作为字符串从 CSV 文件中取出的最佳方法是什么 不能使用 sed awk 等进行预处理 我尝试使用常规 PigStorage 和 Piggybank CsvLoader
  • JavaScript |运算符[重复]

    这个问题在这里已经有答案了 谁能解释一下什么是 和之后的值呢 我知道 0 的输出会创建 13 个集合 即数字 3 2 1 0 但是 呢 1 或 2 var i 52 while i alert i 13 0 它是按位或运算符 有解释和例子在
  • 如何将 java 代码嵌入到批处理脚本中?是否可以创建 .java/.bat 混合文件?

    虽然有一些技术可以让您创建perfect 并非如此perfect 批处理文件与一些 本机 Windows 脚本语言的混合体 完美 的混合体应该是什么样子 嵌入的代码必须可以按原样使用 并且您应该有能力 将其复制粘贴到您想要的任何其他编辑器
  • 虚拟基类的创建顺序

    我有以下问题 struct A1 A1 std cout lt lt A1 struct A2 A2 std cout lt lt A2 struct AA1 virtual A1 A2 AA1 std cout lt lt AA1 str
  • 使用 Cobertura 从代码覆盖率中排除方法

    有没有办法将代码排除在 Cobertura 覆盖率报告之外 我们有一些方法不应包含在覆盖率报告中 因此不会降低覆盖率数字 我知道Clover有这样的功能 但我还没有找到Cobertura的类似功能 您可以从检测中排除类 那么它们就不应该出现
  • 如何在ListView上长按时传递变量?

    我会有列表视图和里面的很多项目 我希望用户可以长按项目并将其设置为收藏夹 为此 我需要长按此菜单获取数据库 ID 我有以下代码 Override public void onCreateContextMenu ContextMenu men
  • Spring批处理:输入资源不存在类路径资源

    我目前正在开发一个 Spring Batch 它首先将 Excel xsls 文件转换为 CSV 然后读取 CSV 处理它并将其数据存储在数据库中 第一步效果很好 批次在第二步停止并抛出此警告 Input resource does not
  • Google Play 游戏实时多人游戏:获取参与者 ID 并将其存储到字符串中

    我正在我的统一游戏中第一次尝试谷歌实时多人游戏 QuickMatch工作得很好 我的意思是我能够获取连接的参与者的 ID 并将其存储到一个字符串中 使用 string MyId PlayGamesPlatform Instance Real
  • 是否可以比较 SQL Server 中相似数据的行

    是否可以在 SQL Server 中比较类似数据的行 我的表中有一个公司名称列 其中公司名称可能有些相似 以下是代表相同 4 个公司的 8 个不同值的示例 ANDORRA WOODS ANDORRA WOODS HEALTHCARE CEN
  • Lua和javascript可以连接吗?

    我不确定这个问题是否恰当 因为英语不是我的母语 lua 和 javascript 可以连接在一起吗 我还没有找到任何相关信息 或者是否有可能 例如在 html 文件中使用两种语言编写脚本 例如 也许可以在这些语言之间共享信息 或者是否可以在
  • 如何在 Java 中合并 CSV 文件

    我的第一个 CSV 文件看起来像这样 包含标题 标题仅包含在顶部 而不包含在每个条目之后 NAME SURNAME AGE Fred Krueger Unknown n records 我的第二个文件可能如下所示 NAME MIDDLENA