从 csv 生成树结构

2024-02-24

我已经为这个问题摸不着头脑有一段时间了。我基本上试图从一组 CSV 数据生成树层次结构。 CSV 数据不一定是有序的。这就像下面这样:

Header: Record1,Record2,Value1,Value2
Row: A,XX,22,33
Row: A,XX,777,888
Row: A,YY,33,11
Row: B,XX,12,0
Row: A,YY,13,23
Row: B,YY,44,98

我正在努力使分组的执行方式尽可能灵活。最简单的分组方法是对 Record1 和 Record2 进行分组,并将 Value1 和 Value2 存储在 Record2 下,以便我们得到以下输出:

Record1
    Record2
        Value1 Value2

这将是:

A
    XX
        22,33
        777,888
    YY
        33,11
        13,23
B
    XX
        12,0
    YY
        44,98 

我目前将我的组设置存储在一个列表中 - 我不知道这是否会妨碍我的想法。此列表包含组的层次结构,例如:

Record1 (SchemaGroup)
    .column = Record1
    .columns = null
    .childGroups =
        Record2 (SchemaGroup)
            .column = Record1
            .columns = Value1 (CSVColumnInformation), Value2 (CSVColumnInformation)
            .childGroups = null

其代码如下所示:

private class SchemaGroup {
    private SchemaGroupType type = SchemaGroupType.StaticText;  // default to text
    private String text;
    private CSVColumnInformation column = null;
    private List<SchemaGroup> childGroups = new ArrayList<SchemaGroup>();
    private List<CSVColumnInformation> columns = new ArrayList<CSVColumnInformation>();
}


private enum SchemaGroupType {
    /** Allow fixed text groups to be added */
    StaticText,
    /** Related to a column with common value */
    ColumnGroup
}

我正在努力为此创建一个算法,试图考虑要使用的底层结构。目前我正在使用我自己的包装类从上到下解析 CSV:

CSVParser csv = new CSVParser(content);
String[] line;
while((line = csv.readLine()) != null ) {
    ...
}

我只是想启动我的编码大脑。

有什么想法吗?


基本思想并不困难:按第一条记录分组,然后按第二条记录分组,依此类推,直到得到如下所示的结果:

(A,XX,22,33)
(A,XX,777,888)
-------------------------
(A,YY,33,11)
(A,YY,13,23)
=============
(B,XX,12,0)
-------------------------
(B,YY,44,98)

然后逆向建造树木。

然而,有一个递归组件使得推理这个问题或一步一步地显示它变得有些困难,所以实际上编写伪代码更容易。

我假设 csv 中的每一行都表示为一个元组。每个元组都有“记录”和“值”,使用您在问题中使用的相同术语。 “记录”是必须放入层次结构中的东西。 “价值观”将是树的叶子。当我使用具有这些特定含义的术语时,我将使用引号。

我还假设所有“记录”都位于所有“值”之前。

废话不多说,上代码:

// builds tree and returns a list of root nodes
// list_of_tuples: a list of tuples read from your csv
// curr_position: used to keep track of recursive calls
// number_of_records: assuming each csv row has n records and then m values, number_of_records equals n
function build_tree(list_of_tuples, curr_position, number_of_records) {
    // check if we have already reached the "values" (which shouldn't get converted into trees)
    if (curr_position == number_of_records) {
        return list of nodes, each containing a "value" (i.e. everything from position number_of_records on)
    }

    grouped = group tuples in list_of_tuples that have the same value in position curr_position, and store these groups indexed by such common value
    unique_values = get unique values in curr_position

    list_of_nodes = empty list

   // create the nodes and (recursively) their children
    for each val in unique_values {
        the_node = create tree node containing val
        the_children = build_tree(grouped[val], curr_position+1, number_of_records)
        the_node.set_children(the_children)

        list_of_nodes.append(the_node)
    }

    return list_of_nodes
}

// in your example, this returns a node with "A" and a node with "B"
// third parameter is 2 because you have 2 "records"
build_tree(list_parsed_from_csv, 0, 2)

现在您必须考虑要使用的具体数据结构,但希望如果您了解算法,这应该不会太困难(正如您提到的,我认为尽早决定数据结构可能会阻碍您的想法) 。

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

从 csv 生成树结构 的相关文章

  • createImage(int width, int height) 的问题

    我有以下代码 作为游戏的一部分每 10 毫秒运行一次 private void gameRender if dbImage null createImage returns null if GraphicsEnvironment isHea
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • “java.net.MalformedURLException:未找到协议”读取到 html 文件

    我收到一个错误 java net MalformedURLException Protocol not found 我想读取网络上的 HTML 文件 mainfest uses permission android name android
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 使用布尔值进行冒泡排序以确定数组是否已排序

    我有以下用于冒泡排序的代码 但它根本不排序 如果我删除布尔值那么它工作正常 我知道 由于我的 a 0 小于所有其他元素 因此没有执行交换 任何人都可以帮助我解决这个问题 package com sample public class Bub
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp

随机推荐

  • 我们如何为 pom.xml 创建一个 build.gradle 等效文件来构建和部署 AEM 代码?

    我正在尝试创建一个构建 gradle文件 例如完整的 pom xmlAEM Maven 原型 https github com Adobe Marketing Cloud aem project archetype or 懒骨头模板 htt
  • 将 id 分开并存储在两个不同的数组中

    NSString string vlaue Highlight 1234 1235 1236 1237 Issuer 100 101 102 103 我需要将 1234 1235 1236 1237 存储在一个数组中 100 101 102
  • 自动激活Maven中的父插件

    是否可以在父 POM 中定义一个已停用的插件 并且当子项目继承此插件时 它会自动激活 我猜您想在父 pom 中配置该插件 但仅在继承的项目中使用它 Maven 有一个专门的部分 在pluginManagement 中配置你的插件 但在你需要
  • 超线程/SMT 是一个有缺陷的概念吗?

    HT SMT 背后的主要思想是 当一个线程停止时 同一核心上的另一个线程可以选择该核心的其余空闲时间并透明地与之一起运行 2013 年 英特尔放弃了 SMT 转而采用乱序执行 Silvermont 处理器核心 因为他们发现这可以提供更好的性
  • 如何在JSP中访问请求属性?

    目前我使用 and then 但是我想知道是否可以使用 EL 或 JSTL 而不是使用 scriptlet 来完成同样的操作 EL表达式 requestScope Error Message JSP EL 中有几个隐式对象 看表达语言 ht
  • 如何使用 Javascript 截断/切片/修剪字符串中的最后一个字符?

    我有一根绳子 12345 00 我希望它返回12345 0 我看过trim 但看起来它只是修剪空白并且slice我不明白这是如何运作的 有什么建议么 您可以使用子串 https developer mozilla org en US doc
  • 如何获取具有唯一属性的对象列表

    背景 我有一个list This list有很多对象 每个对象都有一个id 现在对象有不同的类型 objects Aobject Bobject Cobject where gt gt gt Aobject Bobject True gt
  • 在 Go 中,我们可以使用每个键的锁来同步映射的每个键吗?

    在 Go 中 我们可以使用每个键的锁来同步映射的每个键吗 地图级全局锁总是需要的吗 文档说任何对地图的访问都不是线程安全的 但如果有一把钥匙 那么可以单独上锁吗 不完全是 但如果您只是从地图上读取指针并修改所指对象 那么您就没有修改地图本身
  • 我可以使用从其他项目链接的文件夹中的视图吗?

    我在一个解决方案中有多个 MVC 项目 按照这个接受的答案 Visual Studio 项目中文件夹的 添加为链接 https stackoverflow com questions 3610845 add as link for fold
  • 从平面文件向 SQL Server 插入数百万条记录有哪些陷阱?

    我即将开始编写一个 Windows 窗体应用程序 该应用程序将打开一个以竖线分隔且大小约为 230 mb 的 txt 文件 然后 该应用程序会将这些数据插入到 sql server 2005 数据库中 显然这需要快速发生 我在这个项目中使用
  • 在 iTunes Connect 中更改新应用程序版本号

    我相信我设法让自己在 iTunes Connect 中陷入某种奇怪的僵局 我有一个应用程序 当前版本为 2 14 写完更新后 我决定将新版本编号为2 2 iTunes Connect 允许我做到这一点 当我尝试验证新版本时 它告诉我在 iT
  • 难以理解捕获组和反向引用

    为了整理我对正则表达式的了解 我决定阅读一本关于它们的书 正则表达式简介 我知道这很愚蠢 但其中一个介绍性示例对我来说没有意义 d d 1 示例文本 123 456 7890 应该捕获第一个数字 123 谁能解释一下这里发生了什么 据我所知
  • 批量-通过输入更改帐户密码

    我想在启动时创建一个批处理文件 要求用户更改当前的管理员密码 Step 1 User logins Step 2 Batch file runs displaying message Please change Administrator
  • React - 身份验证过程:无法在调度过程中调度

    我已经开始通过flummox react bootstrap 和react router 来玩react 我正在尝试为我的网站创建一个基本的同构 CMS 语境 在身份验证方面 每个用户都有一个功能列表 每个组件都使用我的身份验证存储 可以
  • 如何在IOS中更新App文件(html)?

    我的应用程序非常简单 我有一些带有 html 文件名的 plist 当用户选择一行时 webview 会加载该 html 文件及其内容 我很好奇如何进行应用程序更新 例如 我有一个新的更新的 html 文件 并进行了更正 我希望用户通过单击
  • 如何在NTVS(Node Tools for Visual Studio)中使用nodemon

    我在 Visual Studio Professional 13 上使用 Node 很快意识到每次代码更改都需要重新启动服务器变得很麻烦 所以我做了一些研究 发现大多数人使用nodemon来自动刷新他们的服务器 尽管在线教程使用命令行使用n
  • 触摸屏摇杆算法

    我想在触摸屏上模拟模拟操纵杆 如下图所示 当摇杆区域中心设置为 cx cy 时 如何计算触摸位置 tx ty 的X方向比和Y方向比 1 0 1 0 x 方向的比率为 tx cx r 其中 r 是圆的半径大小 类似地 y方向比率为 ty cy
  • 使用服务帐户从python调用Google Cloud Function进行身份验证

    我有一个触发器类型设置为 HTTP 的云函数 并且还有一个有权调用云函数的服务帐户 我想从 python 脚本调用云函数 我使用以下脚本来调用该函数 from google oauth2 import service account fro
  • jQuery 验证复选框是否需要选中?

    我正在使用 jQuery 验证插件来验证表单 问题是我找不到一种方法来验证表单中的单个复选框是否被选中 HTML 标记
  • 从 csv 生成树结构

    我已经为这个问题摸不着头脑有一段时间了 我基本上试图从一组 CSV 数据生成树层次结构 CSV 数据不一定是有序的 这就像下面这样 Header Record1 Record2 Value1 Value2 Row A XX 22 33 Ro