我有一個日誌文件(¬deliminator)。從非結構化csv中查找替換文本
073957.744 : Send:[8=FIX.4.4¬9=724¬35=AE¬49=FAUAT¬56=CALUAT¬34=82¬55=0000 AA BBC¬48=0000 AA BBC¬22=100¬38=17000.000000¬9998=Equity¬9999=CFD¬]
080655.776 : Send:[8=FIX.4.4¬9=631¬35=AE¬49=FAUAT¬56=CALUAT¬34=136¬55=NOVN VX CFD¬48=NOVN VX CFD¬22=100¬38=7500.000000¬]
081249.475 : Send:[8=FIX.4.4¬9=620¬35=AE¬49=FAUAT¬56=CALUAT¬34=148¬55=NOK1V FH CFD¬48=NOK1V FH CFD¬22=100¬38=50000.000000¬9896=False¬9893=1¬]
081806.623 : Send:[8=FIX.4.4¬9=583¬35=AE¬49=FAUAT¬56=CALUAT¬34=159¬55=IX17186393-0¬48=IX17186393-0¬22=110¬38=10.000000¬60=20131216-08:09:02¬64=20131219¬552=1¬54=1¬]
我使用下面的代碼將該文件轉換爲CSV並刪除第7列
@echo off
rem fetch only the required messages from log file
findstr /r /i Send:\[.*35=AE.* %cd%\FixProvider_MsgLog_20131216_1.log > %cd%\FilteredFIXMessages.log
rem ensure the older temp file is not present
if exist %cd%\FIXTemp1.tmp del %cd%\FIXTemp1.tmp
rem convert the FilteredFIXMessages.log into csv and store it in temp1 file and strip temp1 file for the first 6 columns as they are not required for data matching
setlocal enabledelayedexpansion
for /f "tokens=1-6* delims=¬" %%a in (%cd%\FilteredFIXMessages.log) do set data=%%h & echo !data:=¬,! >> %cd%\FIXTemp1.tmp
exit /b
這給了我下面的CSV
55=0000 AA BBC,48=0000 AA BBC,22=100,38=17000.000000,9998=Equity,9999=CFD,]
55=NOVN VX CFD,48=NOVN VX CFD,22=100,38=7500.000000,]
55=NOK1V FH CFD,48=NOK1V FH CFD,22=100,38=50000.000000,9896=False,9893=1,]
55=IX17186393-0,48=IX17186393-0,22=110,38=10.000000,60=20131216-08:09:02,64=20131219,552=1,54=1,]
正如你可以看到,這不是一個結構化的CSV(無固定列和列順序也可能有所不同),我想剝離
- 列象55 = *或任何其欲柱(一個或多個)(該數據可以是可變長度的,但列標記是靜態的像55 =等)
- 最後一列
,]
(空欄)
我可以很容易地使用VBS去掉它,但是由於我使用了批處理腳本,我想繼續使用它,而不是安裝任何其他工具。請幫忙。
我在看'for'的文檔。所以令牌7(%h)將每個經過6分隔的分段分隔到最後?我看着幫助,沒有像'printf'這樣的命令來格式化字符串。你可以編寫你自己的exe來模擬printf,返回一個填充字符串,但不知道你是否可以從do主體中調用它。即使可以,您也必須在文件上進行2次傳遞,一次找出最大列數和寬度,一次格式化數據。但是,爲什麼這個csv需要具有固定的結構? – sln
@sln - CSV不需要是固定的結構,因此可變長度文本查找和替換的問題。正如我所提到的,我可以使用VBS輕鬆做到這一點(因爲我比較舒服),但是希望在一個BAT文件中做到這一點。 –
你面臨的最大問題是擺脫'='符號。你不能輕易地批量進行。如果你想把它放在一個整體中,我只需要使用一個混合的vbs/batch腳本。 –