2013-04-18 31 views
5

इस मामले पर विचार करें पंक्तियाँ (और दूसरी तरह के आसपास) के लिए कॉलम करें:स्वरूप डाटा:

1.9170000e +03 $ 1.6909110e +00
1.4550000e +03: मैं कुछ डेटा जो इस तरह दिखता है $ 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

ध्यान दें कि दो कॉलम को अलग करने वाला डॉलर चिह्न किसी भी चरित्र (रिक्त स्थान की एक निश्चित संख्या, \ t (टैब) चार, एक अल्पविराम या केवल किसी भी चरित्र के बारे में हो सकता है जो कॉलम को अलग करने के उद्देश्य से विशिष्ट रूप से उपयोग किया जाता है। यह भी ध्यान रखें कि डेटा में दो से अधिक कॉलम हो सकते हैं।

अब मैं डेटा के ब्लॉक को दोबारा सुधारना चाहता हूं जैसे कि एक निश्चित कॉलम से सभी आइटम एक पंक्ति में सूचीबद्ध होते हैं (चार से अलग किए गए चार जिन्हें मैंने उपरोक्त उदाहरण में $ के रूप में चिह्नित किया है): कॉलम 0 से आइटम पंक्ति 0 भरें, कॉलम 1 से आइटम पंक्ति 1 भरें और इसी तरह से।

क्या ऐसा करने के लिए एक पूर्वनिर्धारित emacs कार्य है? या यदि नहीं, तो क्या यह प्राप्त करने के लिए कुछ "आत्म-लुढ़का" कार्य है?

इसके अलावा मुझे एक ऐसे फ़ंक्शन में बहुत दिलचस्पी है जो रिवर्स चीज करता है, यानी कुछ लाइनें लें और उन्हें कॉलम स्ट्रक्चर में रखें।

किसी भी मदद की बहुत सराहना की है!

उत्तर

6

आप csv-mode (package.el से उपलब्ध) का उपयोग कर सकते हैं। यह एक साधारण ट्रांज़ेक्शन ऑपरेशन है। ऐसा करने के लिए csv-separators से '("$") के मान को कस्टमाइज़ करें और फिर सी-सी सी-टी का उपयोग करें।

+0

यह आंशिक रूप से काम करता है, transposing के बाद मैं याद कर रहा हूँ पंक्ति में विभिन्न वस्तुओं के बीच विभाजक चार। – elemakil

+0

यह यहां काम करता है। क्या आपने चर सेट करने और emacs को पुनरारंभ करने के लिए कस्टमाइज़ का उपयोग किया था? जब मैं सीधे सत्र में चर सेट करता हूं तो मुझे समस्याएं थीं। –

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")))))) 

शायद csv-mode से एक का उपयोग वास्तव में बेहतर होगा, लेकिन आप इस एक परवाह किए बिना :)

यह कैसे काम करता कोशिश कर सकते हैं: यदि आप इसे फोन के रूप में एमएक्सtranspose-table, तो यह मान लेंगे कि तालिका स्तंभ, एकल सफेद स्थान से अलग होते हैं हालांकि, अगर आप इसे संख्यात्मक तर्क के साथ आह्वान (उदाहरण के लिए, एम 3एमएक्सtranspose-table, तो यह आपको 3 कॉलम विभाजक एकत्र करने के लिए संकेत देगा। तुम भी सी-यूसी-यूएम एक्सtranspose-table है जैसे कि यह कहते हैं, और आरईटी दबाने जब अतिरिक्त विभाजक के लिए कहा द्वारा सभी 16 विभाजक प्रदान करने का विकल्प अपना सकता है।

मैं संख्या समारोह के समुचित क्रमसूचक मुद्रण नहीं मिला ... तो, "1'th" के लिए खेद है और "2'th" अंग्रेजी :)

+0

यही वह है जिसे मैं ढूंढ रहा था (जिस मोड में मैं वर्तमान में उपयोग कर रहा हूं उससे कुछ स्वतंत्र) लेकिन इसमें कुछ कीड़े हैं। शुरुआत के लिए, यह अंतिम कॉलम खोना प्रतीत होता है। दो स्तंभों पर चलने पर मुझे एक पंक्ति मिलती है (जिसमें पहले कॉलम से आइटम होते हैं), तीनों पर काम करना मुझे दो पंक्तियां मिलती हैं, और इसी तरह। इसके अलावा, ऐसा प्रतीत होता है कि उपसर्ग तर्क काम नहीं कर रहा है, 'एम -3 एमएक्स ट्रांसपोज़-टेबल' निष्पादित करने से त्रुटि 'let *: गलत प्रकार तर्क: listp, 3' देता है इसके अलावा रिवर्स (पंक्तियों में पंक्ति) अंतिम प्रविष्टि खो देता है (प्रति पंक्ति 8 पंक्तियां -> प्रति पंक्ति 1 पंक्ति "-> प्रति पंक्ति 7 पंक्तियां)। – elemakil

संबंधित मुद्दे