2016-05-07 45 views
3

我有一個xmlstarlet命令看起來像這樣:添加一個換行符以CSV內CONCAT()

xml sel -T-t -m /xml/path -v "concat(name,','value,',')" -n filename.xml > output.csv 

它輸出像這樣

#output.csv 
name,value, 
name,value, 
name,value, 

我希望它看起來像

name,name,name, 
value,value,value, 

我一直專注於嘗試concat內的不同組合:

"concat(name,'<p>'value,',')" 
"concat(name,'<br />'value,',')" 
"concat(name,'"<p>"'value,',')" 
"concat(name,'\n'value,',')" 

我在看完全錯誤的地方嗎?

我最終選擇的路線是使用一個宏,它將excel中的8行轉換爲列。

+1

@shellter謝謝 – buzzin

回答

0

如果無法格式化用xml,然後在下面的腳本輸出:

awk 'BEGIN{FS=","} 
NR==FNR{if(NR!=1){array[$1]=$2;next}} 
END{ 
for (key in array) {printf "%s,",key;valuelist=valuelist""array[key]","} 
{printf "\n";print valuelist} 
}' your_file_name > temp.txt && mv temp.txt your_file_name 

將做的工作適合你。

1

那麼,您的concat語句顯式連接名稱和值。看起來你想要做的是循環兩次元素,首先選擇名稱,然後選擇值。

0

您可以將XML命令後處理您的數據:

unset allnames allvalues 
while IFS=, read -r name value; do 
    allnames+="${name}," 
    allvalues+="${value}," 
done < <(echo "name1,value1 
name2,value2, 
name3,value3") 

echo "${allnames}" 
echo "${allvalues}" 

你不能把它管道while循環(乏設置內循環將迷路了),所以你可以用你的命令一樣使用它這個:

unset allnames allvalues 
while IFS=, read -r name value; do 
    allnames+="${name}," 
    allvalues+="${value}," 
done < <(xml sel -T-t -m /xml/path -v "concat(name,','value,',')" -n filename.xml ) 

echo "${allnames}" > output.csv 
echo "${allvalues}">> output.csv