遍历建议直接用pandas的itertuples(),去除前面的空白字符串用lstrip()就行
df = pd.read_excel("test.xlsx")
for row in df.itertuples():
row.行名称=row.行名称.lstrip()
以上应该就可以了,注意缩进。
在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易懂,但是它不符合面向集合 *** 作的原则,而且性能也比面向集合低。当然,从面向集合 *** 作的角度出发,也有两种方法可以进行遍历表的 *** 作,总结起来,遍历表有下面几种方法。
使用游标
使用表变量
使用临时表
我的需求是:针对HR.Employees表,新增一列fullname,并取值firstname+lastname。
-- 需求是,新增一列fullname,取值firstname+lastnameALTER TABLE HR.Employees ADD fullname NVARCHAR(30) NULLGO
原始效果如下图。
这个需求本来可以一条sql语句搞定,如下代码所示。但是为了演示表的遍历,我还是使用了这三种方式来实现一下。
USE TSQLFundamentals2008GOUPDATE HR.Employees SET fullname= firstname+' '+lastname
使用游标
使用游标的代码比较繁琐,概括起来主要有以下几个步骤,声明游标,打开游标,使用游标,关闭游标和释放游标。示例代码如下。
-- 方法1:游标-- 声明变量DECLARE
@empid AS INT, @firstname AS NVARCHAR(10), @lastname AS NVARCHAR(20)
-- 声明游标DECLARE C_Employees CURSOR FAST_FORWARD FOR
SELECT empid,firstname,lastname
FROM HR.Employees ORDER BY empid
OPEN C_Employees-- 取第一条记录FETCH NEXT FROM C_Employees INTO @empid,@firstname,@lastnameWHILE @@FETCH_STATUS=0BEGIN
-- *** 作
UPDATE HR.Employees SET fullname= @firstname+' '+@lastname WHERE empid=@empid
-- 取下一条记录
FETCH NEXT FROM C_Employees INTO @empid,@firstname,@lastnameEND-- 关闭游标CLOSE C_Employees-- 释放游标DEALLOCATE C_Employees
运行脚本,效果如下图。
可以看到,已经达到我们想要的效果了。
使用表变量
因为使用游标存在性能和违背面向集合思想的问题,所以我们有必要用面向集合的思想去找到一种更好的解决方案,下面这种方法是使用表变量的方式实现的,代码如下。
1 -- 方法2:使用表变量
2 -- 声明表变量
3 DECLARE @temp TABLE
4 (
5 empid INT,
6 firstname NVARCHAR(10),
7 lastname NVARCHAR(20)
8 )
9
10 -- 将源表中的数据插入到表变量中
11 INSERT INTO @temp(empid, firstname, lastname )
12 SELECT empid,firstname,lastname FROM HR.Employees
13 ORDER BY empid
14
15 -- 声明变量
16 DECLARE
17 @empid AS INT,
18 @firstname AS NVARCHAR(10),
19 @lastname AS NVARCHAR(20)
20
21 WHILE EXISTS(SELECT empid FROM @temp)
22 BEGIN
23 -- 也可以使用top 1
24 SET ROWCOUNT 1
25 SELECT @empid= empid, @firstname= firstname,@lastname= lastname FROM @temp
26 UPDATE HR.Employees SET fullname= @firstname+' '+@lastname WHERE empid=@empid
27 SET ROWCOUNT 0
28
29 DELETE FROM @temp WHERE empid=@empid
30 END
使用临时表
临时表也可以实现表变量的功能,所以我们也可以使用临时表来实现这个需求,代码如下。
1 -- 方法3:使用临时表
2 -- 创建临时表
3 IF OBJECT_ID('tempdb.dbo.#tempemployees','U') IS NOT NULL DROP TABLE dbo.#tempemployees
4 GO
5
6 SELECT empid,firstname,lastname
7 INTO dbo.#tempemployees
8 FROM HR.Employees
9 ORDER BY empid
10
11 --SELECT * FROM dbo.#tempemployees
12
13 -- 声明变量
14 DECLARE
15 @empid AS INT,
16 @firstname AS NVARCHAR(10),
17 @lastname AS NVARCHAR(20)
18
19 WHILE EXISTS(SELECT empid FROM dbo.#tempemployees)
20 BEGIN
21 -- 也可以使用top 1
22 SET ROWCOUNT 1
23 SELECT @empid= empid, @firstname= firstname,@lastname= lastname FROM dbo.#tempemployees
24 UPDATE HR.Employees SET fullname= @firstname+' '+@lastname WHERE empid=@empid
25 SET ROWCOUNT 0
26
27 DELETE FROM dbo.#tempemployees WHERE empid=@empid
28 END
当然,实现的效果都是一样的。
rst.Open Sql, cn.ConnectionString我的数据库语言不是很好,但看了你的代码,也觉得很乱,你的代码至少有好几种方法可以修改,上面是最简单的一种,实际上你的数据库在acapp.OpenCurrentDatabase的时候已经打开了,接下来根本就不需要再次使用cn进行连接。
所以第二种改法是:
acApp.OpenCurrentDatabase (dbPath)
'Dim cn As ADODB.Connection '不需要再次连接
'Set cn = acApp.CurrentProject.Connection '不需要再次连接
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
Dim Sql As String
Sql = "Select * From 0012X32"
rst.Open Sql, acApp.ADOConnectString '我只需要在这里调用连接的数据就可以了,而这个连接数据存储在acApp.ADOConnectString里面。
rst.MoveFirst
acApp.OpenCurrentDatabase (dbPath)
'Dim cn As ADODB.Connection '不需要再次连接
'Set cn = acApp.CurrentProject.Connection '不需要再次连接
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
Dim Sql As String
Sql = "Select * From 0012X32"
rst.Open Sql, acApp.ADOConnectString '我只需要在这里调用连接的数据就可以了,而这个连接数据存储在acApp.ADOConnectString里面。
rst.MoveFirst
下面是RecordSet的OPEN的用法:
Open 方法 (ADO Recordset)
打开游标。
语法
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
参数
Source 可选。Variant,计算有效的 Command 对象、SQL 语句、表名、存储过程调用、URL 或包含持久存储 Recordset 的文件名或 Stream 对象。
ActiveConnection 可选。Variant,计算有效的 Connection 对象变量名,或包含 ConnectionString 参数的 String。
CursorType 可选。CursorTypeEnum 值,确定在打开 Recordset 时提供者应使用的游标类型。默认值为 adOpenForwardOnly。
LockType 可选。LockTypeEnum 值,确定在打开 Recordset 时提供者应使用的锁定(并发)类型。默认值为 adLockReadOnly。
Options 可选。Long 值,指示提供者计算 Source 参数的方式(如果该参数表示除 Command 对象之外的某些内容),或者指示 Recordset 应该从以前保存过的文件中恢复。可以是一个或多个 CommandTypeEnum 或 ExecuteOptionEnum 值,这些值可以用位 AND *** 作符组合。
注意 如果从包含持久 Recordset 的 Stream 中打开 Recordset,那么使用 adAsyncFetchNonBlocking 的 ExecuteOptionEnum 值将不起作用;提取 *** 作将同步进行并发生阻塞。adExecuteNoRecords 或 adExecuteStream 的 ExecuteOpenEnum 值不应与 Open 一起使用。
Open 方法 (ADO Recordset)
打开游标。
语法
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
参数
Source 可选。Variant,计算有效的 Command 对象、SQL 语句、表名、存储过程调用、URL 或包含持久存储 Recordset 的文件名或 Stream 对象。
ActiveConnection 可选。Variant,计算有效的 Connection 对象变量名,或包含 ConnectionString 参数的 String。
CursorType 可选。CursorTypeEnum 值,确定在打开 Recordset 时提供者应使用的游标类型。默认值为 adOpenForwardOnly。
LockType 可选。LockTypeEnum 值,确定在打开 Recordset 时提供者应使用的锁定(并发)类型。默认值为 adLockReadOnly。
Options 可选。Long 值,指示提供者计算 Source 参数的方式(如果该参数表示除 Command 对象之外的某些内容),或者指示 Recordset 应该从以前保存过的文件中恢复。可以是一个或多个 CommandTypeEnum 或 ExecuteOptionEnum 值,这些值可以用位 AND *** 作符组合。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)