2013-04-18 25 views
5

bu davayı düşünün Satırlar (ve tersi) için Sütun yapın:Biçim veri:

1.9170000e + 03 $ 1.6909110e + 00
1.4550000e + 03: Şöyle bazı veriler var $ 1.7775459e + 00
1.1800000e + 03 $ 1.8771469e + 00
1.0000000e + 03 $ 1.9992190e + 00
8.7500000e + 02 $ 2.1938025e + 00
7.8300000e + 02 $ 2.5585915e + 00

İki sütunu ayıran dolar işareti herhangi bir karakter olabilir (belirli sayıda boşluktan, \ t (sekme) karakterinden, virgülden veya sütunu ayırmak amacıyla benzersiz olarak kullanılan herhangi bir karakterden oluşabilir. Ayrıca, verilerin ikiden fazla sütuna sahip olabileceğini unutmayın.

Şimdi, veri bloğunu yeniden biçimlendirmek istiyorum ki, belirli bir sütundaki tüm öğeler tek bir satırda listeleniyor (yukarıdaki örnekte $ olarak işaretlediğim karakter tarafından ayrılmış): Sütun 0'dan öğeler satır 1'i doldurun, sütun 1'den öğeleri satır 1'i doldurun ve böyle devam edin.

Bunu yapmak için önceden tanımlanmış bir emacs işlevi var mı? Ya da değilse, bunu başarmak için bazı “kendinden haddelenmiş” fonksiyon var mı?

Ayrıca tersi bir şey yapan, bazı satırları alıp bunları sütun yapısına yerleştiren bir işlevle de ilgileniyorum.

Herhangi bir yardım çok takdir edilmektedir!

cevap

6

csv-mode (package.el ürününü) kullanabilirsiniz. Bu basit bir işlemdir. Bunu yapmak için csv-separators değerini '("$") olarak özelleştirin ve ardından C-c C-t'u kullanın. Sadece pratik uğruna

+0

, aktaran sonra ben eksik "2'th" ... yani, "1'th" için üzgün ve sayıları fonksiyonunun düzgün sıralı baskı bulamadık satırdaki farklı öğeler arasındaki ayırıcı char. – elemakil

+0

Burada çalışıyor. Değişkeni ayarlamak ve emacları yeniden başlatmak için özelleştirme kullandınız mı? Değişkeni doğrudan oturumda ayarladığımda problemlerim vardı. –

1

:

(defun transpose-table (begin end &optional numcols) 
    (interactive "r\nP") 
    (save-excursion 
    (goto-char begin) 
    (move-beginning-of-line 1) 
    (let ((separators 
      (if numcols 
       (loop for i from 0 upto 
        (if (numberp numcols) numcols (car numcols)) 
        for sep = 
        (read-string 
         (format "%d'th column separator (RET to terminate): " i)) 
        until (string= sep "") 
        collect sep) 
      (let ((x (list " "))) (nconc x x)))) 
      (end (save-excursion 
       (goto-char end) 
       (move-end-of-line 1) 
       (point))) lines) 
     (loop while (< (point) end) 
      for start = (point) 
      for line = (buffer-substring 
         start 
         (progn (move-end-of-line 1) (point))) 
      for numlines from 0 
      with numrows = 0 
      with longest-word = 0 
      collect (loop for i from 0 below (length line) 
          with last-pos = 0 
          with rows = 0 
          with sep = separators 
          for sep-length = (length (car sep)) 
          if (and (< (+ sep-length i) (length line)) 
            (string= (car sep) 
              (substring line i (+ i sep-length)))) 
          collect (substring line last-pos i) into words 
          and do (setf longest-word (max longest-word (- i last-pos)) 
             last-pos (+ i sep-length) 
             sep (cdr sep) rows (1+ rows)) 
          end 
          finally (return 
            (progn 
            (setf numrows (max rows numrows)) 
            (if (< last-pos (length line)) 
             (append words (list (substring line last-pos))) 
             words)))) 
      into lines 
      collect longest-word into word-lengths 
      do (unless (eobp) (forward-char)) 
      finally 
      (loop initially (delete-region begin end) 
        for i from 0 to numrows do 
        (loop for line on lines 
         for cell-length in word-lengths do 
         (if (caar line) 
          (let ((insertion (caar line))) 
           (insert insertion 
             (make-string 
             (- cell-length (length insertion) -1) ?\)) 
           (rplaca line (cdar line))) 
          (insert (make-string (1+ cell-length) ?\)))) 
        (insert "\n")))))) 

Belki aslında daha iyi olurdu csv-mode den birini kullanarak, ancak ne olursa olsun bu bir :)

Nasıl Çalışır deneyebilirsiniz: eğer arama Mxtranspose-tableolarak, o zaman tablo sütunlar örneğin M-3Mx 012 (sayısal bağımsız değişken ile çağırmak, ancak, tek boşluk ile ayrılır üstlenecek, daha sonra 3 sütun ayırıcıları toplamanızı isteyecektir. Ayrıca C-uC-uM-xtranspose-table gibi diyoruz ve ekstra ayırıcı için sorulduğunda RET basarak 16 ayırıcılar sağlama ayrılmayı isteyebileceği.

Ben İngilizce :) Bu kısmen çalışır

+0

Aradığım şey (şu anda kullanmakta olduğum moddan bağımsız bir şey) ama bazı hatalar var. Yeni başlayanlar için son sütunu kaybediyor. İki sütun üzerinde çalışıyorum, bir satır (ilk sütundaki öğeleri içeren) alıyorum, üçte çalışıyorum, iki satır var, vb. Ayrıca, öneki argümanı çalışmıyor, 'M-3 Mx aktarım-tablosu' komutunu çalıştırırsanız hata verir * let *: Yanlış tip argümanı: listp, 3' Ayrıca tersi (sütunlara satır) son girişi kaybeder. (Col başına 8 satır -> "col" başına 1 satır -> col başına> 7 satır). – elemakil