Python办公,如何遍历“数据库导出的表格”的所有单元格,清除单元格内容的前后空字符串?

Python办公,如何遍历“数据库导出的表格”的所有单元格,清除单元格内容的前后空字符串?,第1张

由于没有看到导出的表格样本,直接说吧:

遍历建议直接用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 *** 作符组合。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10095502.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存