我在excel表中有大量数据。我需要为该数据准备一个结构并填充数据。我可以用两种方式做到。
在struct初始化期间静态填充结构
struct x a[] = { }
通过分配内存并将其填入函数来动态填充结构。
我的结构看起来也很复杂。我如何填写这个结构?
excel表的一个记录如下:
region name, list of languages supported, list of encodings supported
如何为这些数据定义结构并填充它?
答案 0 :(得分:1)
根据您的评论,您只需要处理60行。那不是很大!打字! :-)
但是让我们更聪明地工作并稍微应用DRY经验法则,以便计算机能够做出无聊的事情,并在数据发展过程中保持最新状态。我建议你做的是编写一个单独的程序来从excel表中提取数据并从中生成一个C头文件,这样你就可以#include
定义。然后,您将能够使用makefile规则从源重建结构定义。 (根据您工作的规则,您可能能够在C之外的其他内容中创建帮助程序,因为它只是一个开发人员工具。)
最后一点;生成静态数据作为结构数组(可能包含结构数组等)比创建链表更简单 。
答案 1 :(得分:0)
如果数据完全动态,您将无法执行1。将它放在代码中的结构初始化中意味着只需将所有数据从excel表复制到源文件中。我猜这是不可行的,因为你说这是巨大的。您必须使用选项2.除非您当然可以选择使用可以阅读电子表格的数据库,这可能是您最好的选择。
答案 2 :(得分:0)
如果每行只包含3列,请将其另存为CSV文件 具有3个变量的结构全部为char * 声明3个char数组。 然后打开文件 使用fgets读取每一行 在数组上的读取字符串上使用sscanf。 使用读取值的大小分配内存并将其存储在结构中。
答案 3 :(得分:0)
如果数据在运行时不会改变,则绝对应该使用静态初始化并声明对象const
。在任何现代平台上,这将导致操作系统与文件系统缓存中的可执行文件副本共享页面,这意味着它实际上不使用物理内存(如果内存不足,页面可以被丢弃并重新读取必要时从可执行文件中删除;不需要保存/交换到磁盘)。
答案 4 :(得分:0)
您没有对您正在开发的平台说太多。如果您的编译器符合C99,则可以使用命名的初始值设定项初始化struct
,如下所示
char *fullname0 = ...
char *phone = ...
.
struct x a[] = {
[0] = { .fname = fullname0, .phn = phone }
[1] = { .fname = fullname1, .phn = phone }
};
如果执行此操作时非常相同,那么最好为每个人struct
的初始化编写一个宏。
#define X_INITIALIZER(NAME, PHONE) { .fname = NAME, .phn = PHONE }
答案 5 :(得分:-2)
您可以使用以下python脚本从CSV生成C结构:
import csv, sys
csvfile = open("eclipses.csv", "rb")
dialect = csv.Sniffer().sniff(csvfile.read(1024))
print "Dialect:", dialect
csvfile.seek(0)
spamReader = csv.reader(csvfile, dialect=dialect)
writer = csv.writer(sys.stdout, quoting=csv.QUOTE_ALL, lineterminator=",\n")
writer.writerows(spamReader)