loadText
语法
loadText(filename, [delimiter], [schema], [skipRows=0], [arrayDelimiter], [containHeader])
参数
filename 字符串,表示数据文件的路径。
delimiter 字符串标量,表示数据文件中各列的分隔符。分隔符可以是一个或多个字符,默认是逗号(’,’)。
schema 表对象,用于指定各字段的数据类型。它可以包含以下四列(其中,name 和 type 这两列是必需的)
列名 |
含义 |
---|---|
name |
字符串,表示列名 |
type |
字符串,表示各列的数据类型。暂不支持 BLOB 类型。 |
format |
字符串,表示数据文件中日期或时间列的格式 |
col |
整型,表示要加载的列的下标。该列的值必须是升序。 |
注意:若 type 为时间类型,则源数据的时间类型格式需要和 DolphinDB 时间类型数据格式一致。若原始数据的时间戳和 DolphinDB 时间类型不兼容,建议导入时先指定为字符串类型,再通过 temporalParse 函数进行转换。
skipRows 0 到 1024 之间的整数,表示从文件头开始忽略的行数。它是一个可选参数。默认值为 0。
arrayDelimiter 数据文件中数组向量列的分隔符。默认是逗号。由于不支持自动识别数组向量,必须同步修改 schema 的 type 列修为数组向量类型。
containHeader 布尔值,表示数据文件是否包含标题行,默认为空。若不设置,则系统将会分析第一行数据并确定其是否为标题行。不同设置下,列名解析规则见详情描述。
详情
将数据文件加载到 DolphinDB 的内存表中。loadText 使用单个线程加载数据,如果需要使用多个线程并行加载数据,请使用 ploadText 函数。
解析列名:
不指定 containHeader 时,导入文本文件时将以字符串格式读取第一行数据,并根据该数据解析列名。但需要注意,系统内部对第一行数据设置了读取上限,即不能超过 256 KB。解析时,如果文件中第一行的内容不包含以数字开头的数据,那么加载文件时系统会将第一行作为列名。如果文件第一行记录中某列记录以数字开头,那么加载文件时系统可能会使用col0, col1, …等作为列名。
指定 containHeader = true 时,则系统将第一行数据视为标题行,并解析出列名。
指定 containHeader = false 时,则系统将添加列名 col0, col1, … 。
解析类型:当 DolphinDB 加载数据文件时,会进行随机抽样,并基于样本决定每列的数据类型。这个方法不一定每次都能准确决定各列的数据类型。因此我们建议,在加载数据前,使用 extractTextSchema 函数查看 DolphinDB 识别每列的数据类型。如果 DolphinDB 识别的数据类型不符合预期,可以在 schema 的 type 列中指定数据类型。对于日期列或时间列,如果 DolphinDB 识别的数据类型不符合预期,不仅需要在 schema 的 type 列指定时间类型,还需要在 format 列中指定数据文件中日期或时间的格式(用字符串表示),如 “MM/dd/yyyy”。如何表示日期和时间格式请参考 日期和时间的调整及格式。
如果只需加载数据文件中的部分列,需要在 schema 的 col 列中指定要加载的列的下标。
由于 DolphinDB 的字符串采用 UTF-8 编码,加载的文件必须是 UTF-8 编码。
由于 DolphinDB 中列名仅可使用中文或英文字母、数字或下划线 (_),且必须以中文或英文字母开头,若数据文件中的列名不符合要求,系统会依据以下规则自动调整列名:
若数据中列名存在中文或英文字母、数字或下划线之外的字符,将其转换为下划线。
若数据中列名第一个字符不是中文或英文字母,添加 “c” 作为该列名首字符。
以下是数据文件中不合规列名以及自动转换的列名的例子:
数据文件中列名 |
自动转换的列名 |
---|---|
1_test |
c1_test |
test-a! |
test_a_ |
[test] |
c_test_ |
注意:从 2.00.10 版本开始,loadText
支持加载一条记录中包含多个换行符的数据文件。
例子
首先,使用以下脚本生成模拟的数据文件:
$ n=10
$ sym=rand(`AAPL`ORCL`MS`SUN,n)
$ permno=take(10001,n)
$ date=rand(2019.06.01..2019.06.10,n)
$ open=rand(100.0,n)
$ high=rand(200.0,n)
$ close=rand(200.0,n)
$ pre_close=rand(200.0,n)
$ change=rand(100.0,n)
$ vol=rand(10000,n)
$ amount=rand(100000.0,n)
$ t=table(sym,permno,date,open,high,close,pre_close,change,vol,amount)
$ saveText(t,"/home/DolphinDB/Data/stock.csv");
例 1. 直接加载数据文件
$ tt=loadText("/home/DolphinDB/Data/stock.csv");
$ tt;
sym |
permno |
date |
open |
high |
close |
pre_close |
change |
vol |
amount |
---|---|---|---|---|---|---|---|---|---|
MS |
10001 |
2019.06.06 |
90.346594 |
80.530542 |
96.474428 |
146.305659 |
0.720236 |
1045 |
90494.568297 |
AAPL |
10001 |
2019.06.07 |
91.165315 |
8.482074 |
85.514922 |
16.259077 |
76.797829 |
7646 |
91623.485996 |
AAPL |
10001 |
2019.06.03 |
45.361885 |
14.077451 |
149.848419 |
89.110375 |
45.499145 |
9555 |
98171.601654 |
MS |
10001 |
2019.06.04 |
8.98688 |
0.591778 |
155.54643 |
132.423187 |
69.95799 |
1202 |
3512.927634 |
MS |
10001 |
2019.06.07 |
62.866173 |
33.465237 |
174.20712 |
102.695818 |
74.580523 |
3524 |
61943.64517 |
MS |
10001 |
2019.06.09 |
32.819915 |
13.319577 |
136.729618 |
63.980405 |
60.66375 |
7078 |
85138.216568 |
MS |
10001 |
2019.06.07 |
90.210866 |
22.728777 |
150.212291 |
59.454705 |
73.916303 |
5306 |
19883.845607 |
AAPL |
10001 |
2019.06.06 |
83.752686 |
71.3501 |
98.211979 |
145.60098 |
94.428343 |
8852 |
9236.020781 |
ORCL |
10001 |
2019.06.01 |
81.64719 |
129.702202 |
182.784373 |
117.575967 |
74.84595 |
2942 |
43394.871242 |
AAPL |
10001 |
2019.06.02 |
10.068382 |
80.875383 |
181.674585 |
138.783821 |
25.298267 |
1088 |
82981.043775 |
$ schema(tt).colDefs;
name |
typeString |
typeInt |
comment |
---|---|---|---|
sym |
SYMBOL |
17 |
|
permno |
INT |
4 |
|
date |
DATE |
6 |
|
open |
DOUBLE |
16 |
|
high |
DOUBLE |
16 |
|
close |
DOUBLE |
16 |
|
pre_close |
DOUBLE |
16 |
|
change |
DOUBLE |
16 |
|
vol |
INT |
4 |
|
amount |
DOUBLE |
16 |
例 2. 指定某列的数据类型来加载数据文件
例如,我们想要把 permno 列的数据类型转换成 SYMBOL,可以用 extractTextSchema 函数获取输入文件的结构,在导入数据前修改该列的数据类型,并指定 loadText 函数的 schema 参数。
$ schema=extractTextSchema("/home/DolphinDB/Data/stock.csv");
$ update schema set type=`SYMBOL where name=`permno;
$ tt=loadText("/home/DolphinDB/Data/stock.csv",,schema);
$ schema(tt).colDefs;
name |
typeString |
typeInt |
comment |
---|---|---|---|
sym |
SYMBOL |
17 |
|
permno |
SYMBOL |
17 |
|
date |
DATE |
6 |
|
open |
DOUBLE |
16 |
|
high |
DOUBLE |
16 |
|
close |
DOUBLE |
16 |
|
pre_close |
DOUBLE |
16 |
|
change |
DOUBLE |
16 |
|
vol |
INT |
4 |
|
amount |
DOUBLE |
16 |
用户也可以指定所有数据类型:
$ schematable=table(`sym`permno`date`open`high`close`pre_close`change`vol`amount as name,`SYMBOL`SYMBOL`DATE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`DOUBLE`INT`DOUBLE as type)
$ tt=loadText("/home/DolphinDB/Data/stock.csv",,schematable)
$ schema(tt).colDefs;
name |
typeString |
typeInt |
comment |
---|---|---|---|
sym |
SYMBOL |
17 |
|
permno |
SYMBOL |
17 |
|
date |
DATE |
6 |
|
open |
DOUBLE |
16 |
|
high |
DOUBLE |
16 |
|
close |
DOUBLE |
16 |
|
pre_close |
DOUBLE |
16 |
|
change |
DOUBLE |
16 |
|
vol |
INT |
4 |
|
amount |
DOUBLE |
16 |
例 3. 只加载部分列
例如,只需加载 sym, date, open, high, close, vol, amount 这 7 列。注意,加载数据时,不能改变各列的先后顺序。如果需要调整列的顺序,可以将数据文件加载后,再使用 reorderColumns! 函数。
$ schema=extractTextSchema("/home/DolphinDB/Data/stock.csv");
$ schema=select * from schema where name in `sym`date`open`high`close`vol`amount
$ schema[`col]=[0,2,3,4,5,8,9]
$ tt=loadText("/home/DolphinDB/Data/stock.csv",,schema);
$ tt;
sym |
date |
open |
high |
close |
vol |
amount |
---|---|---|---|---|---|---|
SUN |
2019.06.10 |
18.675316 |
72.754005 |
136.463909 |
1376 |
31371.319038 |
AAPL |
2019.06.05 |
42.098717 |
196.873587 |
41.513899 |
3632 |
9950.864129 |
ORCL |
2019.06.05 |
62.223474 |
197.099027 |
123.785675 |
3069 |
38035.800937 |
SUN |
2019.06.03 |
0.18163 |
50.669866 |
4.652098 |
6213 |
1842.198893 |
SUN |
2019.06.06 |
32.54134 |
67.012502 |
130.312294 |
4891 |
55744.156823 |
SUN |
2019.06.07 |
56.899091 |
81.709825 |
61.786176 |
1133 |
69057.849515 |
AAPL |
2019.06.08 |
77.026838 |
38.504431 |
22.68496 |
3672 |
34420.187073 |
ORCL |
2019.06.07 |
62.752656 |
39.33621 |
48.483091 |
4382 |
41601.601639 |
AAPL |
2019.06.02 |
8.5487 |
17.623418 |
141.88325 |
8092 |
15449.159988 |
AAPL |
2019.06.02 |
26.178685 |
197.320455 |
110.52407 |
5541 |
14616.820449 |
例 4. 加载文件时,忽略数据文件的前 2 行。
示例文件的第一行为列名,因此忽略前 2 行后,总的数据条数为 9。
$ re=loadText(filename="/home/DolphinDB/Data/stock.csv",skipRows=2)
$ select count(*) from re;
count |
---|
9 |
例 5. 指定时间类型的格式来加载数据文件
生成本例所需的数据文件:
$ time=["20190623145457","20190623155423","20190623163025"]
$ sym=`AAPL`MS`IBM
$ qty=2200 5400 8670
$ price=54.78 59.64 65.23
$ t=table(time,sym,qty,price)
$ saveText(t,"/home/DolphinDB/Data/t2.csv");
加载数据前,使用 extractTextSchema 函数获取该数据文件的结构:
$ extractTextSchema("/home/DolphinDB/Data/t2.csv");
name |
type |
---|---|
time |
LONG |
sym |
SYMBOL |
qty |
INT |
price |
DOUBLE |
由于 time 列的时间格式与 DolphinDB 中的时间格式不同,如果直接加载该文件,time 列的数据将会被识别为长整型。为了能够正确加载该文件 time 列的数据,需要指定 time 列的数据类型为 DATETIME,并且指定该列的格式为 “yyyyMMddHHmmss”。
$ schema=extractTextSchema("/home/DolphinDB/Data/t2.csv")
$ update schema set type = "DATETIME" where name = "time"
$ schema[`format]=["yyyyMMddHHmmss",,,];
$ loadText("/home/DolphinDB/Data/t2.csv",,schema);
time |
sym |
qty |
price |
---|---|---|---|
2019.06.23T14:54:57 |
AAPL |
2200 |
54.78 |
2019.06.23T15:54:23 |
MS |
5400 |
59.64 |
2019.06.23T16:30:25 |
IBM |
8670 |
65.23 |
例 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)
然后调用 loadText 导出该文件:
$ path = "/home/DolphinDB/Data/t.csv"
$ schema=extractTextSchema(path);
$ update schema set type = "DOUBLE[]" where name="bid" or name ="ask"
$ t = loadText(path, schema=schema, arrayDelimiter=",")
$ t;
sid |
date |
bid |
ask |
---|---|---|---|
AMZN |
2022.01.02 |
[1.4799,1.479,1.4787] |
[1.4821,1.4825,1.4828] |
AMZN |
2022.01.03 |
[1.4796,1.479,1.4784] |
[1.4818,1.482,1.4821] |
IBM |
2022.01.04 |
[1.4791,1.479,1.4784] |
[1.4814,1.4818,1.482] |