CSV行列入れ替え

#なでしこ3 #JavaScript #AWK

表計算の TRANSPOSE関数を利用
…するような方法は他の人に解説を譲りまして^^
ここではなでしこさんと JavaScriptと AWKで作り置き。

    //なでしこ3(公式エディタ)で↓

1,2
3,4
5,6」のCSV取得の表行列交換。 //テキスト→二次元配列→行列入れ替え
それを表CSV変換して表示する。 //それ→テキスト→print

#それを(element object)にテキスト設定する。

#↓出力
#1,3,5
#2,4,6


    //JavaScript (in HTML) で↓

        //関数定義.
function csv2matrix (元CSV){
 return 元CSV.split('\n').map(function(一行){
   return 一行.split(',');
 });      //元CSV→split→map(split)→二次元配列
};

function change_matrix (元表){
         //新表行数 = 繰り返し数 = 元表列数なので元表一行をmap.
 return 元表[0].map(function(line,元列番){  //新行indexは元表列番に相当
   return 元表.map(function(元行){
     return 元行[元列番];
   });     //元表から一行一要素 = 縦一列を横一行に = 一次元リスト
 });     //元表[0]の要素数 = 元列数 = 新行数の二次元配列
};

function matrix2csv (新表){
 return 新表.map(function(一次元リスト){
   return 一次元リスト.join(',');
 }).join('\n');  //二次元配列→map(join)→join→新CSV
};

       //メイン.
var 元CSV=`1,2
3,4
5,6`;

var 配列=csv2matrix(元CSV);
配列=change_matrix(配列);
var 新CSV=matrix2csv(配列);

console.log(新CSV);

/*
(textareaオブジェクト).value=新CSV;
(divオブジェクト).innerText=新CSV;

↓出力
1,3,5
2,4,6
*/


    //AWK (on shell) で↓

echo '1,2
3,4
5,6' | awk  '
BEGIN{
 FS = ","
 OFS = ","
}
       #MAIN.
NR==1{num_of_old_cols = NF}
{
         #$1から$NFまで横に読んで.
 #For old_col = 1 To NF
 for (old_col=1; old_col<=NF; old_col++){
   table[old_col, NR] = $old_col  #縦に並べる
 }       #一列広がる
}       #二次元配列完成

END{
         #一行ずつ.
 #For row = 1 To num_of_old_cols
 for (row=1; row<=num_of_old_cols; row++){
   line = ""
           #列を追加していく.
   #For col = 1 To NR
   for (col=1; col<=NR; col++){
     line = line OFS table[row, col]
   }       #一行完成
   line = substr(line, 2)  #行頭のカンマを削除
   print line
 }       #行列完成
}
' #>outfile.txt

#↓出力
#1,3,5
#2,4,6

う~ん、なでしこさんがとってもスレンダーw
あと、後ろ二つはカンマのクオート(,"hoge,fuga",等)考慮してないけど、なでしこさんは善きに計らってくれるよ。

    //日本語プログラミング言語なでしこさん公式↓

(おしまい)

(2022-05-23: 追記)
Pandas DataFrameでの例もここにまとめとく。
Google Colabで↓

import pandas
元df = pandas.read_csv(
    '/content/drive/MyDrive/sample.csv',
    header = None)
#print(元df.T)
元df.T.to_csv(
    '/content/drive/MyDrive/outfile.csv')

_以上_




この記事が気に入ったらサポートをしてみませんか?