如何从难以阅读的 CSV 文件(MySQL 导出)创建视觉上令人愉悦的树状层次结构?

如何从难以阅读的 CSV 文件(MySQL 导出)创建视觉上令人愉悦的树状层次结构?

好吧,情况是这样的:我正在研究一种濒危语言项目。数据保存在 MySQL 数据库中。我可以运行查询来生成层次结构,但层次结构对于人类来说很难阅读。

在此处查看 MySQL 查询输出

"Body Parts",NULL,"Human","Kopf",NULL,NULL
"Clothing","flechten",NULL,NULL,NULL,NULL
"Numbers","zwei",NULL,NULL,NULL,NULL
"Body Parts",NULL,"Human","Haar",NULL,NULL
"Body Parts",NULL,"Human","Auge",NULL,NULL

输出结构

CSV 输出的结构如下,但树任意大:

FOLDER, LEXEME, SUBFOLDER, LEXEME, SUBSUBFOLDER, LEXEME

节点的功能类似于文件夹在文件系统上。它们包含文件夹和文件(词素/单词)。对于下面的示例输出,我将文件夹粗体斜体词素。这也最好出现在乳胶输出中,以便区分词素和文件夹(类别)。

目标

我希望输出按字母顺序排列(虽然我可能能够将其添加到查询中,但这样做还是不错的)。请记住,每个文件夹中都可能有词素和文件夹:

赏心悦目的树

  • 身体部位
    • 动物
    • 人类
      • 奥格
      • 哈尔
      • 科普夫
  • 衣服
    • 弗莱希滕
  • 数字

我应该提到,我使用 进行UTF-8编码和编译。这是一个处理语音xelatexfontspec项目,因此国际音标协会 (IPA)将会被使用。

答案1

我花了一个小时编写以下 Python 脚本,该脚本应该概述如何解决这个问题。

我使用 SQLite,我可以让 Python 连接到我的 MySQL 服务器。我只需检索每一行并检查相应的列是否为“无”(奇怪的是 SQLite 不返回 NULL),然后使用 的easylist简单列表设置来避免所有\begin{itemize}/\end{itemize}麻烦。

在您的情况下,这会稍微复杂一些,例如,您需要选择“人类”下面的所有项目。一种方法可能是在所有列之后对结果集进行排序,然后您必须在每一行检查最后一行是否包含此级别具有相同名称的项目,然后忽略此操作。

这是可以解决的,但是需要花费大量的时间和精力...

#! /usr/bin/python
# -*- coding: utf-8 -*- 
import sqlite3

conn = sqlite3.connect(":memory:")
c = conn.cursor()

# create the table
c.execute('''CREATE TABLE "lex" ("ID" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE , "Folder" VARCHAR,
        "Lexeme1" VARCHAR, "Subfolder" VARCHAR, "Lexeme2" VARCHAR, "Subsubfolder" VARCHAR, "Lexeme3" VARCHAR)''')

c.execute("Insert into lex Values(1,'Body Parts',NULL,'Human','Kopf',NULL,NULL)")
c.execute("Insert into lex Values(2,'Clothing','flechten',NULL,NULL,NULL,NULL)")
c.execute("Insert into lex Values(3,'Numbers','zwei',NULL,NULL,NULL,NULL)")
c.execute("Insert into lex Values(4,'Body Parts',NULL,'Human','Haar',NULL,NULL)")
c.execute("Insert into lex Values(5,'Body Parts',NULL,'Human','Auge',NULL,NULL)")


# Commit
conn.commit()
c.execute("SELECT * FROM lex")

print("\\begin{easylist}[itemize]")
# print all the first cell of all the rows
for row in c.fetchall():
    c1 = str(row[1])
    c2 = str(row[2])
    c3 = str(row[3])
    c4 = str(row[4])
    c5 = str(row[5])
    c6 = str(row[6])
    if c1!="None":
        print("& " + c1)
    if c2!="None":
        print("&& " + c2)
    if c3!="None":
        print("&&& " + c3)
    if c4!="None":
        print("&&&& " + c4)
    if c5!="None":
        print("&&&&& " + c5)
    if c6!="None":
        print("&&&&&& " + c6)

print("\\end{easylist}")

# Close the connection

conn.close()

输出:

\begin{easylist}[itemize]
& Body Parts
&&& Human
&&&& Kopf
& Clothing
&& flechten
& Numbers
&& zwei
& Body Parts
&&& Human
&&&& Haar
& Body Parts
&&& Human
&&&& Auge
\end{easylist}

相关内容