2015-03-31 90 views
0

你好我想這個源文件轉換:轉換一個文件到另一個

源--------

[ODBC Data Sources] 
C334_DEV_MD=Micro ODBC Driver for SQL Server Wire Protocol 
C334_PRD_ST=Micro ODBC Driver for SQL Server Wire Protocol 

[ODBC] 
Trace=0 
TraceFile=odbctrace.out 
TraceDll=/home/mstr/Micro/install/lib32/MYtrcXX.so 
InstallDir=/home/mstr/Micro/install 
IANAAppCodePage=106 
UseCursorLib=0 

[C334_DEV_MD] 
HostName=C334WM01NA02 
PortNumber=1433 
Database=C334_DEV_MD 
DoubleToStringPrecision=17 

[C334_PRD_ST] 
HostName=C334WM01NA02 
PortNumber=1433 
Database=C334_PRD_ST 
DoubleToStringPrecision=17 

源----------

用腳本將此文件導入到此文件中。

目的地--------

C334_DEV_MD=Driver description|HostName=C334WM01NA02;PortNumber=1433;Database=C334_DEV_MD;DoubleToStringPrecision=17|na01liwp01c334 
C334_PRD_ST=Driver description|HostName=C334WM01NA02;PortNumber=1433;Database=C334_PRD_ST;DoubleToStringPrecision=17|na01liwp01c334 

目的地---------

ODBC條目在這裏並不重要。

這是輸出應遵循的模式。

DSN_entry=Driver Description|Parameter1=value;Parameter2=value;Parameter3=value|Server_Name 

Servername可以從源文件的文件名獲取。

這是我到目前爲止所做的,但我卡住了。

#!/bin/bash 
flag=0 
sourcefile=$1 
destfile=$2 
sed -n '2,/^$/p' $sourcefile | awk -F"=" '{print$1}' | sed '$d' | \ 
while read line; do 
     #echo $line 
     grep -E ''"^${line}"'|'"^\[${line}"'' $sourcefile 
done 

回答

0

我會用awk

# Record definitions 
BEGIN { 
    FS="\n"; OFS="|"; RS="\n\n"; ORS="\n" 
} 

# Parse data source descriptions 
$1 ~ /ODBC Data Source/ { 
    for(i=2; i<= NF; i++) { 
     split($i, a, "=") 
     n[a[1]]=a[2] 
    } 
} 

# Output the result record. Replace the datasource id 
# by the description 
$1 ~ /DSN_entry/{ 
    gsub(/\[|\]/,"",$1) 
    print n[$1],$2,$3,$4 
} 

保存上面的腳本到一個文件translate.awk並調用它像這樣:

awk -f translate.awk input.file 
+0

它不會爲我生成任何輸出。我將你的代碼保存在translate.awk文件中並運行awk -f translate.awk input.file。沒有輸出。 – fuzzy186 2015-03-31 13:15:12

+0

嗯。我已經用問題中顯示的數據對它進行了測試。你能發佈你確切的輸入數據嗎? (你使用Linux,意思是'gawk'?) – hek2mgl 2015-03-31 13:19:17

+0

這是我的輸入數據。 – fuzzy186 2015-03-31 13:28:17

0

可能可以爲這個共同破解的東西與awk,但我認爲更理想的選擇是使用一個適當的INI文件解析器。例如,使用Perl和Config::IniFiles

#!/usr/bin/perl 

use Config::IniFiles; 

# We expect the INI file to be given as first parameter. 
scalar(@ARGV) > 0 || die "Missing parameter"; 

my $hostname = $ARGV[0]; 
$hostname =~ s/odbci_(.*)\.ini/\1/; 

# You may want to also pass -nocase => 1 here, for case-insensitive matching 
my $cfg = Config::IniFiles->new(-file => $ARGV[0]); 

my @sources = $cfg->Parameters('ODBC Data Sources'); 

foreach $source (@sources) { 
    my $line = "$source=" . $cfg->val('ODBC Data Sources', $_); 
    my @params = $cfg->Parameters($source); 

    my $sep = "|"; 
    foreach (@params) { 
     $line .= "$sep$_=" . $cfg->val($source, $_); 
     $sep = ";"; 
    } 

    print "$line|$hostname\n"; 
} 

在Python 2相同的:

#!/usr/bin/python 

import ConfigParser 
import re 
import sys 

if len(sys.argv) < 2: 
    print "Need input file parameter" 
    sys.exit(1) 

inifile = sys.argv[1] 
hostname = re.search('odbci_(.*)\.ini', inifile, re.IGNORECASE).group(1) 

cfg = ConfigParser.SafeConfigParser() 
cfg.optionxform = lambda option: option 
cfg.read(inifile) 

for source in cfg.options('ODBC Data Sources'): 
    line = source + '=' + cfg.get('ODBC Data Sources', source) 
    sep = '|' 
    for param in cfg.options(source): 
     line = line + sep + param + '=' + cfg.get(source, param) 
     sep = ';' 

    print line + '|' + hostname 

...並在Python 3:

#!/usr/bin/python3 

import configparser 
import re 
import sys 

if len(sys.argv) < 2: 
    print("Need input file parameter") 
    sys.exit(1) 

inifile = sys.argv[1] 
hostname = re.search('odbci_(.*)\.ini', inifile, re.IGNORECASE).group(1) 

cfg = configparser.SafeConfigParser() 
cfg.optionxform = lambda option: option 
cfg.read(inifile) 

for source in cfg['ODBC Data Sources']: 
    line = source + '=' + cfg['ODBC Data Sources'][source] 
    sep = '|' 
    for param in cfg[source]: 
     line = line + sep + param + '=' + cfg[source][param] 
     sep = ';' 

    print(line + '|' + hostname) 

所有這些期待被稱爲作爲scriptname odbci_hostname.ini

+0

「na01liwp01c334」的名稱來自源文件的名稱 - odbci_na01liwp01c334.ini – fuzzy186 2015-03-31 12:37:42

+0

在這種情況下,您可以執行類似'my $ hostname = $ ARGV [0]; $ hostname =〜s/odbci _(。*)\ .ini/\ 1 /;'及更高版本'print「$ line | $ hostname \ n」;'。 – Wintermute 2015-03-31 12:44:58

+0

我真的想避免使用Perl。看起來我需要將它安裝在服務器上,我不能這樣做。 – fuzzy186 2015-03-31 13:13:30