csv文件操作常用技巧
Excel中删除特定字符前/后的文本
按下CTRL+H
组合快捷键,来进入到查找和替换窗口,例如要批量删去所有逗号及之后的字符,输入,*
,再点击全部替换,就可以实现;若想实现批量删去AB及之前的所有字符,输入*AB
,再点击全部替换。
Excel去除有空缺值的行
先选中目标列,按下Ctrl+G
组合快捷键, 然后选择条件为空值,在选中右键删除,选择删除整行,可统一处理数据值中有空缺值的行
使用Excel的宏功能
1.工作需求:(1)大量excel文件需要处理;(2)对这些excel的处理过程一致,只是重复操作。
2.基本原理:(1)使用“宏录制”录制操作,得到代码;(2)将代码填写至构建好的批处理框架中;(3)运行。
实例需求:在1000个空白excel的sheet1中A1单元格都生成[0,1]的随机数,B1得到A1的10倍。(假设1000个空白excel均已经存在)
操作过程:
(1)打开一个空白excel,找到宏,点击“宏录制”,命名为 chuli;【此时excel将记住你的操作并生成相对应的代码chuli】
(2)在A1输入"=rand()",B1输入"=A1*10";【此时excel已经将你的操作生成相对应的代码chuli】
(3)打开宏,点击“停止录制”,再点击“查看宏”,点击“chuli”,再点击“编辑”;【红色框中的代码即为我们在(2)中操作所对应的代码】
(4)为宏代码附上批处理代码,将下图右边红色框的代码替换掉左边红框的代码;【使“chuli”这个宏,可以对多个选中的excel进行红色框中的处理,即(2)的处理】
代码如下
[上半部分]:
Sub chuli()
Dim f, l&, s As Integer
f = Application.GetOpenFilename(fileFilter:="xlsx文件(*.xlsx),*.xlsx", Title:="选择Excel文件", MultiSelect:=True)
If TypeName(f) = "Boolean" Then Exit Sub
For s = 1 To UBound(f)
Workbooks.Open f(s)
Set xlsxBook = GetObject(f(s))
Set Mywantgetsheet = xlsxBook.Worksheets(1)
Mywantgetsheet.Activate
[下半部分]:
xlsxBook.Save
xlsxBook.Close
Next
MsgBox "finsh"
End Sub
(5)得到结果如下,点击“运行”,选择需要进行处理的excel即可。【注意不可选本excel,会出现问题,必须选择其他需要处理的文件,可以多选】
(6)处理会自动进行,并保存;如果处理的文件是xls或者csv,则需要在开头和结尾代码处,将“xlsx”改为“xls”或者“csv”即可,注意要改全了。
同样的宏的批处理也可以批量将excel进行格式转化,例如将1000个xlsx转化为csv或者反过来,都很方便。
参考:Excel干货——使用excel的宏功能对多个excel文件进行批量处理
使用cmd命令行合并csv文件
- 将需要合并操作的csv文件放置在同一文件目录下,将上方文件地址栏上输入cmd打开(或者在文件夹空白处右键“在终端中打开”,设置为命令提示符;或直接Win+R输入cmd,然后输入
cd 文件路径
) - 打开cmd命令提示符
copy *.CSV all.csv
参考:如何将多个 CSV 文件合并到一个 Excel 工作簿中
VBA将多个excel文件合并为同一文件多个sheet页
1、新建一个文件夹,将需要合并的excel文档复制到该文档目录下
2、新建一个EXCEL空白文档,鼠标移动到在sheet工作表上单击右键,选择“查看代码”选项,进入VBA控制台。
3、在菜单栏点击“插入”菜单,选择“模块”选项,进入模块编辑界面。
4、在编辑框中复制以下代码,注意符号,需是英文状态下。
'功能:把多个excel工作簿的第一个sheet工作表合并到一个excel工作簿的多个sheet工作表,新工作表的名称等于原工作簿的名称
Sub Books2Sheets()
'定义对话框变量
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
'新建一个工作簿
Dim newwb As Workbook
Set newwb = Workbooks.Add
With fd
If .Show = -1 Then
'定义单个文件变量
Dim vrtSelectedItem As Variant
'定义循环变量
Dim i As Integer
i = 1
'开始文件检索
For Each vrtSelectedItem In .SelectedItems
'打开被合并工作簿
Dim tempwb As Workbook
Set tempwb = Workbooks.Open(vrtSelectedItem)
'复制工作表
tempwb.Worksheets(1).Copy Before:=newwb.Worksheets(i)
'把新工作簿的工作表名字改成被复制工作簿文件名,这儿应用于xls文件,即Excel97-2003的文件,如果是Excel2007,需要改成xlsx
newwb.Worksheets(i).Name = VBA.Replace(tempwb.Name, ".xlsx", "")
'关闭被合并工作簿
tempwb.Close SaveChanges:=False
i = i + 1
Next vrtSelectedItem
End If
End With
Set fd = Nothing
End Sub
5、代码输入后,点击菜单项中“运行”,选择“运行子过程”选项,或者按下F5快捷键,运行代码。
6、运行代码后,会弹出文档选择界面,找到新建文件夹的路径,选择你所需要合并的文档,选择文档后,点击“确定”,代码开始运行,运行时间视文档数目而定。
7、代码段运行结束后,就会出现已经合并完成的excel文档界面,新工作表的名称等于原工作簿的名称,大功告成!
参考文章:将多个excel文件合并
为:一个excel文件的多个sheet页【方法技巧】
合并多个Excel sheet页内容到1个sheet页
新建一个Sheet,命名为“All”(名字可随意);右键点击新建Sheet,选择查看代码,或者“Alt+F11”键打开VBA编辑窗口。
将EXCEL中的多个SHEET中内容合并到一个SHEET中
在左侧对应的Sheet“All”上双击,弹出窗口空白处粘贴下面的代码。
Sub hb()
Dim bt, i, r, c, n, first As Long
bt = 1 '表头行数,多行改为对应数值
Cells.Clear
For i = 1 To Sheets.Count
If Sheets(i).Name <> ActiveSheet.Name Then
If first = 0 Then
c = Sheets(i).Cells(1, Columns.Count).End(xlToLeft).Column
Sheets(i).Range("A1").Resize(bt, c).Copy Range("A1")
n = bt + 1: first = 1
End If
r = Sheets(i).Cells(Rows.Count, "A").End(xlUp).Row
Sheets(i).Range("A" & bt + 1).Resize(r - 1, c).Copy Range("A" & n)
n = n + r - bt
End If
Next
End Sub
将EXCEL中的多个SHEET中内容合并到一个SHEET中
“F5”键或点击运行菜单,合并成功!
参考文章:合并多个excel sheet页内容到1个sheet页 5秒搞定
csv去除重复项的多种方式
- Excel删除重复项
- 数据选项卡——删除重复项
- 数据选项卡——筛选高级——在原有区域显示筛选结果——列表区域选中——选择不重复的记录
- 函数+筛选/排序法
如对于以下表格中需要去除姓名和性别均重复的项,只保留一项。
=SUM(N(B$2:B2&C$2:C2=B2&C2))
通过SUM和N函数将一组逻辑值转化为出现次数的计数,然后再根据进行筛选或排序
2.Python法
- 读取CSV
import csvwith open('data.csv','r',encoding = 'utf8') as fp:
reader = csv.reader(fp)
for row in reader:
print(row)
或者使用pandas库:
import pandas as pd #需要导入pandas库
df = pd.read_csv('data.csv')
print(df)
- 用pandas库的.drop_duplicates函数实现去重
import shutil
import pandas as pd
frame=pd.read_csv('盘符:/路径/example.csv',engine='python')
data = frame.drop_duplicates(subset=['列A','列B'], keep='first', inplace=False)
data.to_csv('E:/output.csv', encoding='utf8')
# subset : column label or sequence of labels, optional 用来指定特定的列,默认None所有列
# keep : {‘first’, ‘last’, False}, default ‘first’ 删除重复项并保留第一次/最后一次/删除所有项
# inplace : boolean, default False 是直接在原来数据上修改还是保留一个副本,True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本
例如:
name | sex | age |
---|---|---|
Coco | female | 7 |
Lily | female | 7 |
Joe | female | 15 |
Coco | female | 7 |
执行DataFrame.drop_duplicates(subset = None, keep = 'first')
,产生的结果如下:
name | sex | age |
---|---|---|
Coco | female | 7 |
Lily | female | 7 |
Joe | female | 15 |
若使用代码DataFrame.drop_duplicates(subset = None, keep = 'last')
,结果如下:
name | sex | age |
---|---|---|
Lily | female | 7 |
Joe | female | 15 |
Coco | female | 7 |
即若不考虑index以及行的顺序,last效果与参数first相同。
若使用代码DataFrame.drop_duplicates(subset = None, keep = False)
, 则把相同的行全部删除,结果如下:
name | sex | age |
---|---|---|
Lily | female | 7 |
Joe | female | 15 |
所有重复的行都被删除,没有保留。
若使用代码DataFrame.drop_duplicates(subset = ['sex' , 'age'] , keep = False)
, 结果如下:
name | sex | age |
---|---|---|
Joe | female | 15 |
参考:[Python]python对csv去除重复行 python 2020.2.11;Python 去重csv文件中相同的重复行
将内部结构字段一致的json格式数据转化为csv文件,用Excel无乱码打开并另存为CTF-8格式
# coding=utf-8
import json
import csv
def csv_json():
// 1.分别 读,创建文件
json_fp = open("example.json", "r",encoding='utf-8')
csv_fp = open("example.csv", "w",encoding='utf-8',newline='')
// 2.提出表头和表的内容
data_list = json.load(json_fp)
sheet_title = data_list[0].keys()
// sheet_title = {"姓名","年龄"} # 将表头改为中文
sheet_data = []
for data in data_list:
sheet_data.append(data.values())
// 3.csv 写入器
writer = csv.writer(csv_fp)
// 4.写入表头
writer.writerow(sheet_title)
// 5.写入内容
writer.writerows(sheet_data)
// 6.关闭两个文件
json_fp.close()
csv_fp.close()
print("存完了")
if __name__ == "__main__":
csv_json()
Excel从CSV中导入数据
对于Excel直接打开出现乱码的csv文件,先正常打开一份空白的excel文件,将鼠标定位在第一行第一列,这边鼠标定位的位置将决定后续打开的csv文件在excel中展示的位置,在excel的上方菜单中点击“数据”,如上个步骤截图中标红的数据,页面切换后,点击下图中标红的“ 从文本/CSV ”,在打开的对话框中选中“分隔符号”,在“文件原始格式”中编码选择UTF-8,如下截图中标红所示。设置好之后请点击“下一步”。
再保存为UTF-8编码方式的CSV文件
Vlookup匹配
Vlookup函数
比较 Microsoft Excel 中的列
对于一个数据集,其中 A 列和 B 列都填充了名称,则两列中的相同名称可以显示在 C 列中。例如,如果 Myrtle 位于 A 和 B 中,则 VLOOKUP 可以将该名称放入 C 中。
=IFERROR(VLOOKUP(B2,$A$2:$A$10,1,0),"No Match")
如果想在C列显示两元结果
=IF(ISERROR(VLOOKUP(B2,$A$2:$A$10,1,0)),"No Match","Match")