使用带有 QlikView 的 For 循环加载多个 Excel 工作表
Load multiple Excel sheets using For loop with QlikView
我想从两个不同的 Excel 文件加载数据,并在 QlikView 的同一个 table 中使用它们。
我有两个文件(DIVISION.xls 和 REGION.xls),我正在使用以下代码:
let tt = 'DIVISION$' and 'REGION$';
FOR Each db_schema in 'DIVISION.xls','REGION.xls'
FOR Each v_db in $(tt)
div_reg_table:
LOAD *
FROM $(db_schema)
(biff, embedded labels, table is $(v_db));
NEXT
NEXT
这段代码工作正常,没有显示任何错误,但我没有得到任何数据,也没有看到我的新 table (div_reg_table
)。
你能帮帮我吗?
您的代码未加载任何数据的主要原因是 tt
变量的形式。
当您的内部循环执行时,它计算 tt
(表示为 $(tt)
),然后计算结果为:
'DIVISION$' AND 'REGION$'
结果为空,因为它们只是两个字符串。
如果您稍微更改语句,从 LET
到 SET
并删除 AND
,则内部循环将起作用。例如:
SET tt = 'DIVISION$', 'REGION$';
但是,这现在也意味着您的内部循环将针对 both 工作簿的 tt
中的每个值执行。这意味着除非您的 DIVISION
工作簿中有 REGION
sheet,否则加载将失败。
为避免这种情况,您可能希望稍微重组脚本,以便拥有一个控制 table 来详细说明要加载的文件和 table。我准备的例子如下所示:
FileList:
LOAD * INLINE [
FileName, TableName
REGION.XLS, REGION$
DIVISION.XLS, DIVISION$
];
FOR i = 0 TO NoOfRows('FileList') - 1
LET FileName = peek('FileName', i, 'FileList');
LET TableName = peek('TableName', i, 'FileList');
div_reg_table:
LOAD
*
FROM '$(FileName)'
(biff, embedded labels, table is '$(TableName)');
NEXT
如果您只有两个文件 DIVISION.XLS
和 REGION.XLS
那么可能值得一个接一个地使用两个单独的加载,并完全删除 for 循环。例如:
div_reg_table:
LOAD
*
FROM [DIVISION.XLS]
(biff, embedded labels, table is DIVISION$)
WHERE DivisionName = 'AA';
LOAD
*
FROM [REGION.XLS]
(biff, embedded labels, table is REGION$)
WHERE RegionName = 'BB';
难道你不需要让 noofrows('Filelist') 测试比答案少 1。
noofrows('filelist') 将评估为 2,因此您将获得 0,1 和 2 的循环步骤。因此 2 将 return 为 null,这将导致它失败。
我是这样做的:
文件列表:
加载 * 内联 [
文件名、表名
REGION.XLS,区域
DIVISION.XLS,除法
];
让 vNo=NoOfRows('FileList')-1;
对于 i = 0 到 $(vNo)
LET FileName = peek('FileName', i, 'FileList');
LET TableName = peek('TableName', i, 'FileList');
div_reg_table:
LOAD
*,
$(i) as I,
FileBaseName() as SOURCE
FROM '$(FileName)'
(biff, embedded labels, table is '$(TableName)');
下一个
我想从两个不同的 Excel 文件加载数据,并在 QlikView 的同一个 table 中使用它们。
我有两个文件(DIVISION.xls 和 REGION.xls),我正在使用以下代码:
let tt = 'DIVISION$' and 'REGION$';
FOR Each db_schema in 'DIVISION.xls','REGION.xls'
FOR Each v_db in $(tt)
div_reg_table:
LOAD *
FROM $(db_schema)
(biff, embedded labels, table is $(v_db));
NEXT
NEXT
这段代码工作正常,没有显示任何错误,但我没有得到任何数据,也没有看到我的新 table (div_reg_table
)。
你能帮帮我吗?
您的代码未加载任何数据的主要原因是 tt
变量的形式。
当您的内部循环执行时,它计算 tt
(表示为 $(tt)
),然后计算结果为:
'DIVISION$' AND 'REGION$'
结果为空,因为它们只是两个字符串。
如果您稍微更改语句,从 LET
到 SET
并删除 AND
,则内部循环将起作用。例如:
SET tt = 'DIVISION$', 'REGION$';
但是,这现在也意味着您的内部循环将针对 both 工作簿的 tt
中的每个值执行。这意味着除非您的 DIVISION
工作簿中有 REGION
sheet,否则加载将失败。
为避免这种情况,您可能希望稍微重组脚本,以便拥有一个控制 table 来详细说明要加载的文件和 table。我准备的例子如下所示:
FileList:
LOAD * INLINE [
FileName, TableName
REGION.XLS, REGION$
DIVISION.XLS, DIVISION$
];
FOR i = 0 TO NoOfRows('FileList') - 1
LET FileName = peek('FileName', i, 'FileList');
LET TableName = peek('TableName', i, 'FileList');
div_reg_table:
LOAD
*
FROM '$(FileName)'
(biff, embedded labels, table is '$(TableName)');
NEXT
如果您只有两个文件 DIVISION.XLS
和 REGION.XLS
那么可能值得一个接一个地使用两个单独的加载,并完全删除 for 循环。例如:
div_reg_table:
LOAD
*
FROM [DIVISION.XLS]
(biff, embedded labels, table is DIVISION$)
WHERE DivisionName = 'AA';
LOAD
*
FROM [REGION.XLS]
(biff, embedded labels, table is REGION$)
WHERE RegionName = 'BB';
难道你不需要让 noofrows('Filelist') 测试比答案少 1。
noofrows('filelist') 将评估为 2,因此您将获得 0,1 和 2 的循环步骤。因此 2 将 return 为 null,这将导致它失败。
我是这样做的:
文件列表: 加载 * 内联 [ 文件名、表名 REGION.XLS,区域 DIVISION.XLS,除法 ];
让 vNo=NoOfRows('FileList')-1;
对于 i = 0 到 $(vNo)
LET FileName = peek('FileName', i, 'FileList');
LET TableName = peek('TableName', i, 'FileList');
div_reg_table:
LOAD
*,
$(i) as I,
FileBaseName() as SOURCE
FROM '$(FileName)'
(biff, embedded labels, table is '$(TableName)');
下一个