loadTextEx

语法

loadTextEx(dbHandle, tableName, partitionColumns, filename, [delimiter], [schema], [skipRows=0], [transform], [sortColumns], [atomic=false], [arrayDelimiter], [containHeader])

参数

dbHandle 是数据库的句柄,可以是内存数据库或分布式数据库。

tableName 是一个字符串,表示表的名称。

partitionColumns 是字符串标量或向量,表示分区列。对于顺序分区类型的数据库,partitionColumns 为空字符串””。对于组合分区类型的数据库,partitionColumns 是字符串向量。

filename 是字符串,表示数据文件的路径。

delimiter 字符串标量,表示数据文件中各列的分隔符。分隔符可以是一个或多个字符,默认是逗号(’,’)。

schema 是一个表,用于指定各列的数据类型。具体请参考 loadTextschema 参数。

skipRows 是0到1024之间的整数,表示从文件头开始忽略的行数。它是一个可选参数。默认值为0。

transform 是一元函数,并且该函数接受的参数必须是一个表。

sortColumns 是字符串标量或向量,用于指定表的排序列。同一个排序列对应的数据在分区内部按顺序存放在一起。

  • 对于比较频繁查询的字段比如股票名、设备名,适合设置为 sortColumns。查询时,sortColumns 作为索引入口,可以定位数据所在的文件位置,提高查询性能。

  • sortColumns 有多列,最后一列需为时间相关列。

  • sortColumns 必须是 integer, date/time, string, 或 symbol 类型。

  • sortColumns 用于分区组织分区内部数据,可以不同于分区字段。

New in version 2.00.4: 参数 atomic

atomic 是一个布尔值,表示开启 Cache Engine 的情况下,是否保证文件加载的原子性。设置为true,一个文件的加载过程视为一个完整的事务;设置为false,加载一个文件的过程分为多个事务进行。

注意:如果要加载的文件超过 Cache Engine 大小,必须设置 atomic = false。否则,一个事务可能卡住(既不能提交,也不能回滚)。

New in version 2.00.5: 参数 arrayDelimiter

arrayDelimiter 是数据文件中数组向量列的分隔符。默认是逗号。由于不支持自动识别数组向量,必须同步修改 schema 的 type 列修为数组向量类型。

New in version 2.00.8: 参数 containHeader

containHeader 布尔值,表示数据文件是否包含标题行,默认为空。具体请参考 loadTextcontainHeader 参数。

详请

将数据文件加载到数据库中。

  • 如果要将数据文件加载到分布式数据库中,必须指定 tableName,并且不能为空字符串。

  • 如果要将数据文件加载到内存数据库中,那么 tableName 为空字符串或者不指定 tableName

如果指定了 transform 参数,需要先创建分区表,再加载数据。系统会对数据文件中的数据执行 transform 参数指定的函数,再将得到的结果保存到数据库中。

loadTextEx 函数与 loadText 函数有很多共同之处,例如第一行数据是否判断为列名,如何确定各列的数据类型,列名的要求及自动调整等。细节请参见 loadText 函数文档。

注意:从 2.00.10 版本开始,loadTextEx 支持加载一条记录中包含多个换行符的数据文件。

例子

使用以下脚本生成模拟的数据文件:

$ n=10000
$ ID=rand(100, n)
$ dates=2017.08.07..2017.08.11
$ date=rand(dates, n)
$ vol=rand(1..10 join int(), n)
$ t=table(ID, date, vol)
$ saveText(t, "/home/DolphinDB/Data/t.txt");

例1. 把 t.txt 文件加载到范围分区类型的分布式数据库中,分区列为 ID。

$ db = database(directory="dfs://rangedb", partitionType=RANGE, partitionScheme=0 51 101)
$ pt=loadTextEx(dbHandle=db,tableName=`pt, partitionColumns=`ID, filename="/home/DolphinDB/Data/t.txt");

例2. 将文本文件加载到使用 TSDB 存储引擎创建的分布式数据库中。

$ db = database(directory="dfs://rangedb", partitionType=RANGE, partitionScheme=0 51 101, engine='TSDB')
$ pt=loadTextEx(dbHandle=db, tableName=`pt, partitionColumns=`ID, filename="/home/DolphinDB/Data/t.txt", sortColumns=`ID`date);

例3. 把 t.txt 文件加载到组合分区类型的分布式数据库中,分区列为 date 和 ID。

$ dbDate = database(directory="", partitionType=VALUE, partitionScheme=2017.08.07..2017.08.11)
$ dbID=database(directory="", partitionType=RANGE, partitionScheme=0 51 101)
$ db = database(directory="dfs://compoDB", partitionType=COMPO, partitionScheme=[dbDate, dbID])
$ pt = loadTextEx(dbHandle=db,tableName=`pt, partitionColumns=`date`ID, filename="/home/DolphinDB/Data/t.txt");

例4. 把 t.txt 加载到值分区类型分内存数据库中,分区列为 date。

$ db = database(directory="", partitionType=VALUE, partitionScheme=2017.08.07..2017.08.11)
$ pt = db.loadTextEx(tableName="", partitionColumns=`date, filename="/home/DolphinDB/Data/t.txt");

$ pt.sortBy!(`ID`x);

例5. 示例文件的 vol 列包含空值,将空值填充为0后再加载到组合分区类型的分布式数据库中。

$ dbDate = database(directory="", partitionType=VALUE, partitionScheme=2017.08.07..2017.08.11)
$ dbID=database(directory="", partitionType=RANGE, partitionScheme=0 51 101)
$ db = database(directory="dfs://compoDB", partitionType=COMPO, partitionScheme=[dbDate, dbID]);

$ pt=db.createPartitionedTable(table=t, tableName=`pt, partitionColumns=`date`ID)
$ pt=loadTextEx(dbHandle=db, tableName=`pt, partitionColumns=`date`ID, filename="/home/DolphinDB/Data/t.txt", transform=nullFill!{,0});

例 6. 加载包含数组向量列的数据

使用以下脚本模拟生成一个 csv 文本文件:

$ bid = array(DOUBLE[], 0, 20).append!([1.4799 1.479 1.4787, 1.4796 1.479 1.4784, 1.4791 1.479 1.4784])
$ ask = array(DOUBLE[], 0, 20).append!([1.4821 1.4825 1.4828, 1.4818 1.482 1.4821, 1.4814 1.4818 1.482])
$ TradeDate = 2022.01.01 + 1..3
$ SecurityID = rand(`APPL`AMZN`IBM, 3)
$ t = table(SecurityID as `sid, TradeDate as `date, bid as `bid, ask as `ask)
$ t;
$ saveText(t,filename="/home/DolphinDB/Data/t.csv",delimiter=',',append=true)

然后调用 loadTextEx 导出该文件:

$ db = database(directory="dfs://testDB", partitionType=VALUE, partitionScheme=`APPL`AMZN`IBM, engine='TSDB')
$ path = "/home/DolphinDB/Data/t.csv"
$ schema = extractTextSchema(path);
$ update schema set type = "DOUBLE[]" where name="bid" or name ="ask"
$ loadTextEx(dbHandle=db, tableName=`t, partitionColumns=`sid, filename=path, schema=schema, arrayDelimiter=",", sortColumns=`sid`date);
$ select * from t;

sid

date

bid

ask

AMZN

2022.01.04

[1.479100,1.479000,1.478400]

[1.481400,1.481800,1.482000]

AMZN

2022.01.03

[1.479600,1.479000,1.478400]

[1.481800,1.482000,1.482100]

AMZN

2022.01.04

[1.479100,1.479000,1.478400]

[1.481400,1.481800,1.482000]

APPL

2022.01.02

[1.479900,1.479000,1.478700]

[1.482100,1.482500,1.482800]

APPL

2022.01.03

[1.479600,1.479000,1.478400]

[1.481800,1.482000,1.482100]

APPL

2022.01.04

[1.479100,1.479000,1.478400]

[1.481400,1.481800,1.482000]

IBM

2022.01.02

[1.479900,1.479000,1.478700]

[1.482100,1.482500,1.482800]

IBM

2022.01.03

[1.479600,1.479000,1.478400]

[1.481800,1.482000,1.482100]

IBM

2022.01.02

[1.479900,1.479000,1.478700]

[1.482100,1.482500,1.482800]