# Load

LOAD 语句可以加载以下来源的字段：文件、脚本中定义的数据、预先载入的输入表格、网页、后续 SELECT 语句产生的结果或自动生成的数据。

语法：

LOAD [ distinct ] fieldlist

[( from file [ format-spec ] |

from\_field fieldassource [format-spec]

inline data [ format-spec ] |

*resident* table-label |

autogenerate size )]

[ where criterion | while criterion ]

[ group\_by groupbyfieldlist ]

[order\_by orderbyfieldlist ]

参数：

加载参数

| 参数 | 说明 |
| --- | --- |
| distinct [](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm) | 如果只想加载唯一的记录，则可以用 distinct 作谓词。如果有重复的记录，将加载第一个实例。<br><br>如果使用前置加载，则需要将 distinct 放置在第一个 LOAD 语句中，因为 distinct 只会影响目标表。 |
| fieldlist | fieldlist ::= ( \* \| field {, field } )<br><br>要加载的字段列表。使用 \* 作为字段列表，表示表格中全部字段。<br><br>field ::= ( fieldref \| expression ) [as aliasname ]<br><br>字段定义必须总是包含精确的对现存字段或表达式的引用。<br><br>fieldref ::= ( fieldname \|@fieldnumber \|@startpos:endpos [ I \| U \| R \| B \| T] )<br><br>fieldname 是指与表格中的字段名完全相同的文本。注意，如果包含空格，则字段名必须使用双引号或方括号括起来。有时字段名不会显示可用。这时使用另外的符号：<br><br>@fieldnumber 表示字段数字在带分隔符的表格文件中。它必须是前面带“@”的正整数。编号通常从 1 开始至字段数字。<br><br>@startpos:endpos 代表在拥有固定长度记录的文件中字段的开始和结束位置。这两个位置必须都是正整数。这两个数字前都必须加上“@”并用冒号隔开。编号通常从 1 开始至位置数字。在最后一个字段中，将 n 用作结束位置。<br><br><ul><li>如果 <span>@<span>startpos</span>:<span>endpos</span></span> 后紧随字符 <span>I</span> 或 <span>U</span>，字节读取将分别解释为二进制带符号 (<span>I</span>) 或不带符号 (<span>U</span>) 整数（Intel 字节序）。数字读取位置必须是 1，2 或 4。 </li><li>如果 <span>@<span>startpos</span>:<span>endpos</span></span> 后紧随字符 <span>R</span>，字节读取将解释成二进制实数（IEEE 32-bit 或 64 位浮点）。数字读取位置必须是4 或 8。 </li><li>如果 <span>@<span>startpos</span>:<span>endpos</span></span> 后紧随字符 <span>B</span>，字节读取将根据 COMP-3 标准解释成 <span>BCD (Binary Coded Decimal)</span> 数字。任何字节数可以是指定的。 </li></ul><br><br>expression 可以是数学函数或基于同一表格中一个或多个其他字段的字符串函数。有关详细信息，请参阅表达式的语法。<br><br>[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)as 用于为字段赋予新名称。 |
| [](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)from | from 在数据需要从文件中加载时使用。<br><br>file ::= [ path ] filename<br><br><ul><li><p>  绝对 </p><p><span><span>示例： </span></span><span>c:\data\</span></p></li><li><p>相对于 <span>QlikView</span> 文档路径。</p><p><span><span>示例： </span></span><span>data\</span></p></li><li><p>URL 地址（<span>HTTP</span> 或 <span>FTP</span>），指向一个互联网或内联网的位置。URL 必须进行 URL 编码，例如，如果它包含空格字符。</p><p><span><span>示例： </span></span><span>http://www.qlik.com</span></p><p><span><span>示例： </span></span><span>http://www.enterprise.com/project%20files</span> (<span>http://www.enterprise.com/project files</span>)</p></li></ul><br><br>如果路径被省略，QlikView 则在由 Directory 语句指定的目录中搜索文件。如果没有 Directory 语句，QlikView 则在工作目录中进行搜索，该目录是 QlikView 文件所存放的目录。<br><br>信息注释在 QlikView 服务器安装中，默认工作目录是 C:\ProgramData\QlikTech\Documents。默认工作目录可在 QlikView 管理控制台 中修改。<br><br>filename 可能包含标准 DOS 通配符字符（\* 和 ?）。这将导致指定目录中的所有匹配文件被加载。<br><br>format-spec ::= ( fspec-item { , fspec-item } )<br><br>格式规格包含数个格式规格项目的列表（在括号中）。<br><br>[Directory](https://help.qlik.com/zh-CN/qlikview/May2024/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Directory.htm)<br><br>[From](https://help.qlik.com/zh-CN/qlikview/May2024/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/From.htm) |
| [](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)from\_field | 如果需要从之前加载的字段加载数据，则使用 from\_field 语句。<br><br>fieldassource::=(tablename, fieldname)<br><br>该字段是之前加载过的 tablename 和 fieldname 的名称。<br><br>format-spec ::= ( fspec-item {, fspec-item } )<br><br>格式规格包含数个格式规格项目的列表（在括号中）。 |
| [](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)inline | inline 当数据需要输入脚本而不是从文件中加载时使用该符号。<br><br>data ::= [ text ]<br><br>通过 inline 子句输入的数据必须用特定字符括起来 - 方括号、引号或反引号。括号之间的文本以同一方式被解释为文件的内容。因此，当您需要在文本文件中插入新的一行时，您应该在 inline 子句文本中重复该操作：键入脚本时按压输入键。<br><br>在简单的内联加载中，列的数量由第一行定义。<br><br>format-spec ::= ( fspec-item {, fspec-item } )<br><br>您可以使用许多可用于其他已加载表的相同格式规范项来自定义内联加载。这些项目列在括号之中。更多信息，请参阅[格式规格项目](https://help.qlik.com/zh-CN/qlikview/May2024/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptSpecifiers/format-specification-items.htm)。<br><br>有关内联加载的更多信息，请参阅[从内联表加载数据](https://help.qlik.com/zh-CN/qlikview/May2024/Subsystems/Client/Content/QV_QlikView/Scripting/inline-loads-qv.htm)。 |
| [](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)resident | 如果需要从之前加载的表格加载数据，则使用 resident 语句。<br><br>table label 是加在创建于原始表格的 LOAD 或 SELECT 语句之前的标签。该标签需要在末尾加上冒号。<br><br>在 QlikView 12.00 或更高版本中使用 distinct 和 resident load 语句的组合时，数据加载顺序与 QlikView 11.20 不同。要定义所需的加载顺序，请添加 order by 子句。<br><br>[从之前加载的表格中加载数据](https://help.qlik.com/zh-CN/qlikview/May2024/Subsystems/Client/Content/QV_QlikView/Scripting/load-data-from-previously-loaded-table.htm)<br><br>[表格标签](https://help.qlik.com/zh-CN/qlikview/May2024/Subsystems/Client/Content/QV_QlikView/Scripting/table-labels.htm) |
| [](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)autogenerate | autogenerate 是数据需要 QlikView 自动生成时使用。<br><br>size ::= number<br><br>Number 是用来指示生成记录数字的整数。字段列表不能包含需要数据库中数据的表达式。表达式只允许使用常数和无参数函数（如 rand() 或 recno()）。 |
| extension | 您可以从分析连接加载数据。您需要使用扩展子句来调用服务器端扩展 (SSE) 插件中定义的函数，或者评估脚本。<br><br>您可以向 SSE 插件发送一个表，并返回一个数据表。如果插件没有指定返回的字段的名称，则字段将被命名为 Field1, Field2，依此类推。<br><br>Extension pluginname.functionname( tabledescription );<br><br><ul><li><p>使用 SSE 插件中的函数加载数据 </p><p><span>tabledescription ::= (table { ,tablefield} )</span></p><p>如果不说明表字段，则字段将按加载顺序使用。</p></li><li><p>通过评估 SSE 插件中的脚本加载数据</p><p><span>tabledescription ::= ( script, table { ,tablefield} )</span></p></li></ul><br><br>表字段定义中的数据类型处理<br><br>在分析连接中自动检测数据类型。如果数据没有数值并且至少有一个非 NULL 文本字符串，则该字段被视为文本。在任何其他情况下，它都被视为数字。<br><br>您可以通过用 String() 或 Mixed() 包封字段名来强制使用数据类型。<br><br><ul><li><span>String()</span> 强制要求字段为文本。如果字段是数字字段，则提取双重值的文本部分，不执行转换。</li><li><span>Mixed()</span> 强制要求字段为双重值。</li></ul><br><br>String() 或 Mixed() 不能在扩展表字段定义之外使用，也不能在表字段定义中使用其他 QlikView 函数。<br><br>有关分析连接的更多信息<br><br>有关在 QlikView Server 或 QlikView Desktop 中创建分析连接，请参阅：[分析连接](https://help.qlik.com/zh-CN/qlikview/May2024/Subsystems/Client/Content/QV_QlikView/Analytic_connections.htm)<br><br>您可在 GitHub 储存库中了解有关分析连接的更多信息。[qlik-oss/server-side-extension](https://github.com/qlik-oss/server-side-extension) |
| [](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)where | where 是一个子句，用于陈述一个记录是否应该包括在选择项内。如果 criterion 为 True，则将其包括在选择项内。<br><br>criterion 是一个逻辑表达式。 |
| [](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)while | while 是用于显示记录是否应该反复读取的子句。只要 criterion 为 True，就会读取同一记录。为了能发挥作用，while 子句通常应包含 IterNo( ) 函数。<br><br>criterion 是一个逻辑表达式。 |
| [](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)group\_by | group by 是用于定义应聚合（组合）的字段的子句。 聚合字段应该以某种方式包含在加载表达式中。除了聚合字段没有其他字段可被用于加载表达式中的聚合函数之外。<br><br>groupbyfieldlist ::= (fieldname { ,fieldname } ) |
| [](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)order\_by | order by 是用于被加于 load 语句之前的驻留表记录排序的子句。驻留表可以被一个或多个字段以升序或降序的顺序排序。排序主要由数值决定，其次由国家校对顺序决定。此子句仅在数据源为驻留表时可用。<br><br>排序字段用于指定驻留表按哪些字段排序。驻留表中的字段可以由其名称或其数字指定（第一个字段为 1）。<br><br>orderbyfieldlist ::= fieldname [ sortorder ] { , fieldname [ sortorder ] }<br><br>sortorder 要么是 asc（对于升序），要么是 desc（对于降序）。如果未指定任何 sortorder，则采用 asc。<br><br>fieldname、path、filename 和 aliasname 都是表示他们各自名称的字符串。源表格中的任何字段都可用作 fieldname。但是，通过子句 (aliasname) 创建的字段不在此范围之内，且不能用于相同的 load 语句内。 |

如果 from、inline、resident、from\_field 或 autogenerate 子句都无法给出数据源，则数据将从 SELECT 或 LOAD 语句随后得出的结果中加载。接下来的语句不应包含前缀。

[前置 LOAD](https://help.qlik.com/zh-CN/qlikview/May2024/Subsystems/Client/Content/QV_QlikView/Scripting/preceding-load.htm)

示例：

[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)

#### 加载不同文件格式

使用默认选项加载分隔符分隔的数据文件：

`LOAD * from data1.csv;
` ` `

加载以逗号为分隔符且包含嵌入标签的分隔文件：

`LOAD * from 'c:\userfiles\data1.csv' (ansi, 
 txt, delimiter is ',', embedded labels);
` ` `

加载以制表符为分隔符且包含嵌入标签的分隔文件：

`LOAD * from 'c:\userfiles\data2.txt' (ansi, 
 txt, delimiter is '\t', embedded labels);` ` `

加载包含嵌入标题的 dif 文件：

`LOAD * from file2.dif (ansi, dif, embedded 
 labels);` ` `

从没有标题的固定记录文件加载三个字段：

`LOAD @1:2 as ID, @3:25 as Name, @57:80 as City 
 from data4.fix (ansi, fix, no labels, header is 0, record is 80);
` ` `

加载指定绝对文件路径的 QVX 文件：

`LOAD * from C:\qdssamples\xyz.qvx (qvx);` ` `

[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)

#### 选择特定字段，重命名和计算字段

仅从分隔符分隔的文件加载三个特定字段：

`LOAD FirstName, LastName, Number from data1.csv;
` ` `

加载没有标签的文件时，将第一个字段重命名为 A，将第二个字段重命名为 B：

`LOAD @1 as A, @2 as B from data3.txt (ansi, 
 txt, delimiter is '\t', no labels);
` ` `

以 FirstName、空格字符和 LastName 的串联形式加载 Name：

`LOAD FirstName&' '&LastName as Name 
 from data1.csv;
` ` `

加载 Quantity、Price 和 Value（有 Quantity 和 Price 的产品）：

`LOAD Quantity, Price, Quantity*Price as Value 
 from data1.csv;`

[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)

#### 选择特定记录

仅加载唯一记录，重复记录会被丢弃：

`LOAD distinct FirstName, LastName, Number from 
 data1.csv;
` ` `

仅加载字段 Litres 值大于零的记录：

`LOAD * from Consumption.csv where Litres>0;
`

[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)

#### 加载不在文件中的数据和自动生成的数据

加载一个包含内联数据的表格、两个名为 CatID 和 Category 的字段：

` LOAD * Inline
         ` ` [CatID, Category
         ` ` 0,Regular
         ` ` 1,Occasional
         ` ` 2,Permanent];
         ` ` `

加载一个包含内联数据的表格、三个名为 UserID、Password 和 Access 的字段：

` LOAD * Inline [UserID, Password, Access
         ` ` A, ABC456, User
         ` ` B, VIP789, Admin];
         ` ` `

加载一个有 10000 行的表格。字段 A 将包含读取记录 (1,2,3,4,5...) 的数量，字段 B 将包含一个介于 0 和 1 之间的随机数字：

`LOAD RecNo( ) as A, rand( ) as B autogenerate(10000);`

信息注释autogenerate 后的括号虽允许使用，但不是必须的。

[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)

#### 从之前加载的表格中加载数据

首先，加载一个分隔符分隔的表格文件，并将其命名为 tab1：

` tab1:
         ` `SELECT A,B,C,D from transtable;
` ` `

从已加载的 tab1 表格中加载字段作为 tab2：

`tab2:` `LOAD A,B,month(C),A*B+D as E resident tab1;` ` `

从已加载的 tab1 表格中加载字段，但仅加载 A 大于 B 的记录：

`tab3:` `LOAD A,A+B+C resident tab1 where A>B;` ` `

从已加载的 tab1 表格中加载按 A 排序的字段：

`LOAD A,B*C as E resident tab1 order by A;` ` `

从已加载的 tab1 表格中加载先按第一个字段，然后按第二个字段排序的字段：

`LOAD A,B*C as E resident tab1 order by 1,2;` ` `

从已加载的 tab1 表格中加载依次按 C 降序，B 升序，第一个字段降序排序的字段：

`LOAD A,B*C as E resident 
 tab1 order by C desc, B asc, 1 des;`

[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)

#### 从之前加载的字段中加载数据

从之前加载的表格 Characters 中加载字段 Types 作为 A：

`LOAD A from_field (Characters, 
 Types);`

[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)

#### 从随后的表格中加载数据（前置加载）

使用随后的 SELECT 语句从已加载的 Table1 中加载 A、 B 以及计算字段 X 和 Y：

` LOAD A, B, if(C>0,'positive','negative') 
 as X, weekday(D) as Y;
         ` `SELECT A,B,C,D from Table1;` ` `

[前置 LOAD](https://help.qlik.com/zh-CN/qlikview/May2024/Subsystems/Client/Content/QV_QlikView/Scripting/preceding-load.htm)

[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)

#### 组合数据

加载按 ArtNo 分组（聚合）的字段：

`LOAD ArtNo, round(Sum(TransAmount),0.05) as 
 ArtNoTotal from table.csv group by ArtNo;
` ` `

加载按 Week 和 ArtNo 分组（聚合）的字段：

`LOAD Week, ArtNo, round(Avg(TransAmount),0.05) 
 as WeekArtNoAverages from table.csv group by Week, ArtNo;` ` `

[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)

#### 重复读取一个记录

在本例中，输入文件 Grades.csv 包含合并在一个字段中的每个学生的分数：

`Student,Grades` `Mike,5234` `John,3345` `Pete,1234` `Paul,3352`

分数（1-5 分）分别代表科目 Math、English、Science 和 History。通过使用 while 子句（使用 IterNo( ) 函数作为一个计数器）多次读取每一条记录，我们可以将分数划分为单独的值。在每一次读取中，分数使用 Mid 函数进行提取，使用 Grade 进行存储，而科目则使用 pick 函数进行选择，使用 Subject 进行存储。最后一个 while 子句包含检查是否所有分数均已读取的测试（本例中每个学生四个分数），这表示应该读取下一个学生记录。

` MyTab:
         ` ` LOAD 
 Student,
         ` ` mid(Grades,IterNo( 
 ),1) as Grade,
         ` ` pick(IterNo( 
 ), 'Math', 'English', 'Science', 'History') as Subject from Grades.csv
         ` `while IsNum(mid(Grades,IterNo(),1));` ` `

结果是包含以下数据的表格：

![A table containing data for Students, Subjects, and Grades.](https://help.qlik.com/zh-CN/qlikview/May2024/Subsystems/Client/Content/Resources/Images/ex_gen_LoadRepeated.png)

[](https://help.qlik.com/en-US/qlikview/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/Load.htm)

#### 从分析连接加载

使用以下样本数据。

```
Values:
Load
 Rand() as A,
 Rand() as B,
 Rand() as C
AutoGenerate(50);
```

使用函数加载数据

在这些例子中，我们假设我们有一个名为 P 的分析连接插件，它包含一个自定义函数 Calculate(Parameter1, Parameter2)。函数返回包含字段 Field1 和 Field2 的表格 Results。

```
Load * Extension P.Calculate( Values{A, C} );
```

加载在将 A 和 C 字段发送到函数时返回的所有字段。

```
Load Field1 Extension P.Calculate( Values{A, C} );
```

向函数发送字段 A 和 C 时仅加载 Field1 字段。

```
Load * Extension P.Calculate( Values );
```

加载在将 A 和 B 字段发送到函数时返回的所有字段。由于字段未指定，A 和 B 按它们在表中为第一位的顺序使用。

```
Load * Extension P.Calculate( Values {C, C});
```

加载向函数的两个参数发送字段 C 时返回的所有字段。

Load \* Extension P.Calculate( Values {String(A), Mixed(B)});

加载在将强制为字符串的 A 字段和强制为数字的 B 字段发送到函数时返回的所有字段。

通过评估脚本加载数据

Load A as A\_echo, B as B\_echo Extension R.ScriptEval( 'q;', Values{A, B} );

在发送 A 和 B 的值时加载脚本 q 返回的表。

Load \* Extension R.ScriptEval( '$(My\_R\_Script)', Values{A, B} );

在发送 A 和 B 的值时，加载存储在 My\_R\_Script 变量中的脚本返回的表。

Load \* Extension R.ScriptEval( '$(My\_R\_Script)', Values{B as D, \*} );

在发送重命名为 D, A 和 C的B 值时，加载存储在 My\_R\_Script 变量中的脚本返回的表。使用 \* 发送剩余的未引用字段。

## 了解详情

* [格式规格项目](https://help.qlik.com/zh-CN/qlikview/May2024/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptSpecifiers/format-specification-items.htm)