当前位置:网站首页>使用bat向文件的第一行中写入内容
使用bat向文件的第一行中写入内容
2022-06-11 10:14:00 【sun0322】
目录
■扩展3(对扩展2的改进: 查找文件,即 find 代替 findstr)
■扩展4 (截取每一行中,从第n(70)位开始,截取m(20)位。 )
■前言(希望的功能)
批量删除CSV文件第一行的表头,重新写入【新的标头】。
(即,删除第一行的内容后,重新写入新的内容)
■実現
-----------------------------------------------------------------------------------------------------
@setlocal enabledelayedexpansion
@echo off
set newFirstLineStr=%1
set newFirstLineStr2=%newFirstLineStr:""="%
set newFirstLineStr3=%newFirstLineStr2:"空值"=""%
set newFirstLineStr4=%newFirstLineStr3:kkk= %
cd /d %~dp0
set inputdir=c:\data\in
set outputdir=c:\data\out
for /f "delims=" %%i in ('dir /b /s %inputdir%\*.txt') do xcopy /Y %%i %outputdir%
for /f "delims=" %%i in ('dir /b /s %outputdir%\*.txt') do (
set flag=1
for /f "delims=" %%j in ('type %%i') do (
if !flag!==1 (
set flag=0 & echo %newFirstLineStr4%>%%i
) else echo %%j>>%%i
)
)■実現----------------------------------------------------------------------------------------------------- bug 修正前
(初版bat)VBA调用bat,传入参数(参数内容为西【新的标头】)
(即第一行替换为新的内容,其他行的内容保持不变。)
@setlocal enabledelayedexpansion
@echo off
set newFirstLineStr=%1
cd /d %~dp0
set inputdir=c:\data\in
set outputdir=c:\data\out
for /f "delims=" %%i in ('dir /b /s %inputdir%\*.txt') do xcopy /Y %%i %outputdir%
for /f "delims=" %%i in ('dir /b /s %outputdir%\*.txt') do (
set flag=1
for /f "delims=" %%j in ('type %%i') do (
if !flag!==1 (
set flag=0 & echo %newFirstLineStr:""="%>%%i
) else echo %%j>>%%i
)
)※ 因为VBA传递进来的参数为 「""1","2","3""」多了一层双引号,所以 要把【连续的两个双引号】替换为【一个双引号】 %str:""="%
※ 【TODO→完了】 bug修正中 中间如果有空项目,“” 也会被替换为一个“ 例:""1","2","3","","5""
↑解决:
VBA代码中,生成字符串的时候,「""1","2","3","空值","5""」
BAT中替换两次
set newFirstLineStr2=%newFirstLineStr:""="%
set newFirstLineStr3=%newFirstLineStr2:"空值"=""%
。。。。
set flag=0 & echo %newFirstLineStr3%>%%i
※ 注意:延期变量使用时,要使用!变量名!
※ 【TODO】 处理源的文件中,如果有换行,并且这个换行是Linux的换行。\n
那么复制后的文件,所有的换行都会变成windows的换行。\r\n
↑影响:处理源文件是CSV文件,CSV文件中,项目如果有行内换行(\n),转换后的CSV文件,再次作为数据投入时,和原有数据不一致。
↑【解决中。。。】windows环境,bat脚本中,使用echo后,如何指定换行符为[\n]-CSDN论坛
※ 【TODO→完了】 VBA侧传入的参数带有空格
↑解决:
VBA侧把空格替换成kkk
bat侧再把kkk替换为空格
set newFirstLineStr4=%newFirstLineStr3:kkk= %VBA中
str = Replace(str, " ", "kkk")■参考
■参考1
・为文件添加head,body
@echo off
for /f "delims=" %%i in ('type input.txt') do (
if not defined a (
echo head----------- >output.txt
set a=a & echo %%i>>output.txt
echo body----------- >> output.txt
) else echo %%i >>output.txt
) ・效果
・input.txt
11aaa11
11aaa11
222bbb222
333ccc333
6666
・执行bat
生成 output.txt
head-----------
11aaa11
body-----------
11aaa11
222bbb222
333ccc333
6666
■参考2
more /e +1 input.txt> input1.txt■参考3------------------------------------------------------------------------------------------------------
VBA调用BAT
VBA调用bat,doc 命令行 窗口关闭之后,VBA代码 再继续执行_sun0322-CSDN博客
VBA读取文件名
VBA遍历文件夹下文件文件实用源码 - 愚公一山 - 博客园
BAT相关代码
从当前文件夹以及子文件夹中,批量移动指定名字的文件_sun0322-CSDN博客
VBA处理文件框架代码 【第二部分:变量定义】_sun0322-CSDN博客_vba 框架
bat for 循环中定义变量(变量值不显示,通过使用「延期变量扩展」方式解决)_sun0322-CSDN博客
---
■扩展1 (VBA实现)
VBA读取指定目录下,任意一个文件,第一行的内容
Dim fileName As String
' 如果有文件,会取出排序第一的文件的名字。(只有文件名,没有目录信息)
fileName = Dir("c:\data\" & "*.csv")
If fileName ="" then
Application.StautsBar = "File Not Found"
Exit sub
end If
Dim oldTitleStr
Open "c:\data\" & fileName For Input As #1
Do While Not EOF(1)
Line Input #1, oldTitleStr
‘ 只读取一行,即退出循环
Exit Do
Loop
Close #1参照
VBA遍历文件夹下文件文件实用源码 - 愚公一山 - 博客园
■扩展2
获取数组的长度
Dim len As Integer
len = UBound(list) - LBound(list) + 1--
■扩展2(遍历文件,找到指定字符串,并输出到指定文件中)
※ 数据量大时,不建议使用,
仅仅是处理一个900多K, 2500行的数据,就耗时5分钟左右的时间。
===
注意:第24行的代码需要加上双引号。
(原因,【查询对象字符串】中含有空格, 【查询KEY】中 含有空格)
echo "%%j" | findstr "%MARCH_STR%" >nul && (===
@setlocal enabledelayedexpansion
@echo off
set newFirstLineStr=%1
cd /d %~dp0
set inputdir=c:\data\in
set outputdir=c:\data\out
set MARCH_STR=XXXX XXXXX XXXXX
echo FIND_KEY:%MARCH_STR%>%outputdir%\result.txt
echo FIND_RESULT:>>%outputdir%\result.txt
for /f "delims=" %%i in ('dir /b /s %inputdir%\*.txt') do xcopy /Y %%i %outputdir%
for /f "delims=" %%i in ('dir /b /s %outputdir%\*.txt') do (
set FIND_FLAG=0
for /f "delims=" %%j in ('type %%i') do (
echo "%%j" | findstr "%MARCH_STR%" >nul && (
set FIND_FLAG=1
) || (
set FIND_FLAG=0
)
if !FIND_FLAG!==1 (
echo %%j>>%outputdir%\result.txt
)
)
)===
■扩展2(显示读取行数)
注意:bat数字相加式
set /a COUNT=!COUNT!+1
@setlocal enabledelayedexpansion
@echo off
set newFirstLineStr=%1
cd /d %~dp0
set inputdir=c:\data\in
set outputdir=c:\data\out
set MARCH_STR=XXXX XXXXX XXXXX
echo FIND_KEY:%MARCH_STR%>%outputdir%\result.txt
echo FIND_RESULT:>>%outputdir%\result.txt
for /f "delims=" %%i in ('dir /b /s %inputdir%\*.txt') do xcopy /Y %%i %outputdir%
for /f "delims=" %%i in ('dir /b /s %outputdir%\*.txt') do (
set FIND_FLAG=0
set COUNT=0
for /f "delims=" %%j in ('type %%i') do (
set /a COUNT=!COUNT!+1
echo !COUNT!
echo "%%j" | findstr "%MARCH_STR%" >nul && (
set FIND_FLAG=1
) || (
set FIND_FLAG=0
)
if !FIND_FLAG!==1 (
echo %%j>>%outputdir%\result.txt
)
)
)===
■扩展3(对扩展2的改进: 查找文件,即 find 代替 findstr)
type xxx.log | find "XXX XXX XX" >result.txt■扩展3(直接使用findstr,以文件单位,进行检索)
使用 下面 命令时,有时会出现乱码问题,而且是随机(Random)在某一行出现。
type xxx.log | find "XXX XXX XX" >result.txt
出现原因未知,所以还可以使用下面的代码,进行查询。
findstr /R "AAABBBCCC.*ID.*ID" xxx.log>result.txt参数 /R 代表支持正则表达式
===
■扩展4 对某个文件中的内容进行替换 (可以多次替换)
@echo off
chcp 65001
rem delims为字符串 eol=# 忽略以#开头的行 tokens=1-10* 从第1组到10*
rem 括号里填写你要替换的文件
(for /f "delims=" %%a in (a.txt) do (
rem 将一个值赋给一个变量
set "str=%%a"
setlocal enabledelayedexpansion
rem 旧字符串=新字符串
set "str=!str:wwww2=1111!"
set "str=!str:wwww3=2222!"
set "str=!str:wwww4=3333!"
echo,!str!
endlocal
))>"112.txt"
rem 先把(已经完成替换)好的文件替换旧文件
move /y "112.txt" "a.txt"
■扩展4 (截取每一行中,从第n(70)位开始,截取m(20)位。 )
(适用于每行格式都相同文件)
@echo off
chcp 65001
cd %~dp0
(for /f "delims=" %%a in (101_Grep.txt) do (
set "str=%%a"
setlocal enabledelayedexpansion
set "str=!str:~70,20!"
echo,!str!
endlocal
))>"101.txt"■扩展5 合并文件
@echo off
setlocal enabledelayedexpansion
copy *.csv newFile.csv
pause■扩展5 合并文件(另外一种方式)
使用 下面这种方式合并,在合并后文件的最后一行,会有一个未知的特殊字符。
copy *.csv newFile.txt
所以,还可以使用下面这种方式合并文件
echo=>newfile.txt
for /f "delims=" %%i in (11.csv) do (
echo %%i>>newfile.txt
)
for /f "delims=" %%i in (12.csv) do (
echo %%i>>newfile.txt
)
for /f "delims=" %%i in (13.csv) do (
echo %%i>>newfile.csv
)
....===
■扩展6 去掉重复的行
A.txt 中有重复的数据
输出到B.txt中,从而去掉重复的数据
@echo off
cd.>B.txt
for /f "delims=" %%i in (A.txt) do (
find /i "%%i" B.txt||echo %%i>>B.txt
)----
边栏推荐
- Function and function of wandfluh proportional valve
- Override and reload?
- [image denoising] image denoising based on median + wavelet + Wiener + filter, including Matlab source code
- Cisp-pte XSS Foundation
- BeanFactory 与FactoryBean的区别
- 【clickhouse专栏】新建库角色用户初始化
- 宜居行星
- rpc的正确打开方式|读懂Go原生net/rpc包
- MySQL comparison
- 优秀测试工程师必备的4项安全测试方法!
猜你喜欢

steamVR简介

Chemical composition of q355hr steel plate

不同CV任务的标注类型

【机器学习理论】True Positive, True Negative, False Positive, False Negative概念

有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?

Initial deployment of Servlet

Datagrip 2022, datagrip function

With determination to forge ahead, JASMINER continues to deepen its brand strength

Cisp-pte XSS Foundation

Leetcode brushing questions - hand tearing binary tree
随机推荐
穆格测试控制器的作用和应用场合有哪些
Q1营收超华尔街预期,挚文集团的价值等待回归
Differences between beanfactorypostprocessor and beanpostprocessor
图片规则翻页
MySQL 权限管理和备份
What are the application fields of MAG gear pump? To sum up
【高并发】关于线程池,蚂蚁金服面试官问了我这些内容!!
Address of my bookmark
BeanFactoryPostProcessor 与BeanPostProcessor的区别
Override and reload?
FPGA基础架构【参考ug998】
什么是数字孪生?一个实时而虚拟的表现形式
steamVR简介
[image denoising] image denoising based on median + wavelet + Wiener + filter, including Matlab source code
Tree topology networking structure of ZigBee module communication protocol
Cisp-pte XSS Foundation
Beginning simple blog emlog theme template V3
With determination to forge ahead, JASMINER continues to deepen its brand strength
puppeteer入门之 Puppeteer 类
利用PHP开发的一款万能、表白墙系统部分代码片段