我有这个数据库,我需要将它带入某种结构。 目前我没有LinuxOS,所以我只尝试使用Windows Batch。 原始结构有点像这样:
name=Person1
firstname=aaaa
age=00
city=bbbb
country=cccc
telephone=12345678
name=Person2
firstname=dddd
age=00
city=eeee
country=ffff
telephone=11223344
name=Person3
...
现在我需要在这样的结构中只得到这个结构的某些元素:
name,firstname,telephone
eg.:
Person1,aaaa,12345678
Person2,dddd,11223344
...
因为我对Batch不是很熟悉,所以我最终创造了一些相当“蛮力”的东西;) 通过我的代码,我得到了这样的结构:
name,firstname,telephone,name,firstname,telephone,name,...
eg.:
Person1,aaaa,12345678,Person2,dddd,11223344,Person2,...
这就是我现在被困住的地方......我的蛮力方法有很多IF条件似乎不起作用......我想知道我在推理中是否有错误,这很可能,因为正如我所说,我对Batch不是很熟悉。
好的,对不起,说够了。请看一下我生硬的丑陋代码:
@echo off
set count=1
type testfile.txt | findstr /V age | findstr /V city | findstr /V country >> work.txt
For /F "usebackq tokens=2 delims==" %%A in ("work.txt") Do @<nul set /p"=%%A,">>"work2.txt"
For /F "tokens=* delims=," %%A in (work2.txt) DO (
IF %count% EQU 1 (set name=%%A)
IF %count% EQU 2 (set fname=%%A)
IF %count% EQU 3 (set phone=%%A, set count=0)
set /a count+=1
) %name%,%fname%,%phone%>> done.txt
del work.txt, work2.txt
exit
是谁愿意帮忙?提前谢谢!
答案 0 :(得分:1)
@echo off
setlocal EnableDelayedExpansion
set "telephone="
(for /F "delims=" %%a in (testfile.txt) do (
rem Set variable with value of current line
set "%%a"
if defined telephone (
echo !name!,!firstname!,!telephone!
set "telephone="
)
)) > done.txt
答案 1 :(得分:0)
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "separator=,"
SET "F1="
FOR /f "tokens=1*delims==" %%a IN (q25597324.txt) DO (
IF NOT DEFINED F1 (SET "F1=%%a"&CALL :zapflds)
IF /i "%%a"=="!F1!" IF DEFINED $%%a CALL :report %*
SET "$%%a=%%b"
)
CALL :report %*
GOTO :EOF
::
:: Report fields required
::
:report
IF "%1"=="" ECHO %$$:~1%&GOTO zapflds
SET "$$=%$$%%separator%"
FOR /F "tokens=1*delims==" %%m In ('set $%1 2^>Nul') DO IF /i "%%m"=="$%1" SET "$$=%$$%%%n"
SHIFT
GOTO report
::
:: Clear fields-being-used
::
:zapflds
:: remove variables starting $
FOR /F "delims==" %%z In ('set $ 2^>Nul') DO SET "%%z="
GOTO :eof
我使用了一个名为q25597324.txt
的文件,其中包含我的测试数据。
只需运行 thisbatchname 名称,名字,电话
生成所需订单所需字段的报告。
该例程通过将f1
设置为遇到的第一个字段的名称来工作(我假设该字段名的下一次出现将指示新记录。)记录该字段名称并且所有环境变量以$
已被清除。
然后将每个fieldvalue分配给变量$fieldname
,直到下一次出现f1
。当f1
next作为字段名出现时,会生成一个报告行,并再次清除$
个变量。
报告了最后一条记录,因为在最后一个字段之后没有f1
。
:report
例程的参数只是命令行中必填字段的列表。字符串$$
使用分隔符和第一个指定字段的内容构建,该字段名由shift
从列表中删除并继续,直到没有剩下必填字段名。然后显示$$
中构建的值(第一个字符除外),清除后自己完成所有操作!
答案 2 :(得分:0)
这解决了所述的任务:
file.txt
是输入文件,输出文件是file.csv
@echo off
set "file=file.csv"
set "terms=name firstname telephone"
>"%file%" echo %terms: =,%
for /f "tokens=1,* delims==" %%a in ('findstr /i "%terms%" ^< "file.txt" ') do (
if /i "%%a"=="telephone" (set /p =%%b<nul&echo() else (set /p =%%b,<nul)
) >> "%file%"
pause