[Çözüldü] Terminal kullanarak dosya düzenleme

Başlatan apocuk, 16 Kasım 2014 - 20:54:22

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

apocuk

Arkadaşlar elimde üç sütun halinde veriler var ben bu dosyaların ilk sütununu diğer sütunları
kaydırarak veri eklemek istiyorum bunu yapmak istememin sebebi binlerce dosyanın olması.
C++ programlama biliyorum ama epey uğraştıracak gibi beni bunun yerine terminalden acaba
yapılabilir mi?
Mecburiyet Esaretin Diğer Adıdır.....
http://abdurrahmanakturk.wordpress.com/

ersinkandemir

Sütün derken txt veya csv dosyası şeklinde ve ayraçlar ile ayrılmış sütünlar mı? Bir de ekleyeceğiniz veriler hazır mı, sabit mi yoksa satıra göre değişecek mi? Bash ve AWK ile halledilebilir gibi duruyor.
Where there's a shell, there's a way.



91011

Daha önce bende böyle bri kaydırma işlemi yapmıştım c# ta 10 bin satırlık bri dosya idi. 10 bin satırı bir texbox a kopyaladım sonra yap butonuna tıkladığımda bazı sutunların arsını açıyordu ama çalıştırdığımda kilitlendi ve 15 20 saniye bekledikten sonra çıktıyı verdi.

Siz binlerce dosya olduğunu söylüyorsunuz c++ ta bir klasördeki dosyalrı otomatik okutacak bir kod var mı ?*
Tanrı konuşmaz, şeytan fısıldar...

apocuk

ekleyeceğim veriler sabit aynı suan tum dosyalar xls formatında ve blok blok ayrılmıs durumda veriler aşağıdakı gibi ben birinci sütuna veri
satırı kadar misal "Fe" yazacağım bunu yapmak istiyorum.

[eklenti yönetici tarafından silindi]
Mecburiyet Esaretin Diğer Adıdır.....
http://abdurrahmanakturk.wordpress.com/

91011

Çok fazla bir c++ bilgim yok ama aşağıdaki kod bulunduğu dizini listeliyor sizin bilginiz varsa ubun yapabilirsiniz bence:


files[indis] yaparak dosyaları döngüyle açıp satır satır okutarak istediğiniz şekilde düzenleyebilirsiniz hemde her değiştirmede açmanıza gerek kalmaz.


#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <vector>
#include <string>
#include <iostream>

using namespace std;

/*function... might want it in some class?*/
int getdir (string dir, vector<string> &files)
{
    DIR *dp;
    struct dirent *dirp;
    if((dp  = opendir(dir.c_str())) == NULL) {
        cout << "Error(" << errno << ") opening " << dir << endl;
        return errno;
    }

    while ((dirp = readdir(dp)) != NULL) {
        files.push_back(string(dirp->d_name));
    }
    closedir(dp);
    return 0;
}

int main()
{
    string dir = string(".");
    vector<string> files = vector<string>();

    getdir(dir,files);

    for (unsigned int i = 0;i < files.size();i++) {
        cout << files[i] << endl;
    }
    return 0;
}
Tanrı konuşmaz, şeytan fısıldar...

ersinkandemir

Sütünların hepsini seçip sağa doğru sürükleyin. Daha sonra ilk sütunun ilk hücresine Fe yazın ve köşesinden aşağı kadar çekin, o şekilde olmuyor mu? Koda gerek yok gibi pek.
Where there's a shell, there's a way.



91011

Alıntı yapılan: ersinkandemir - 16 Kasım 2014 - 21:34:49
Sütünların hepsini seçip sağa doğru sürükleyin. Daha sonra ilk sütunun ilk hücresine Fe yazın ve köşesinden aşağı kadar çekin, o şekilde olmuyor mu? Koda gerek yok gibi pek.

ama binlerce dosya olduğunu söyledi.
Tanrı konuşmaz, şeytan fısıldar...

ersinkandemir

#7
Pardon ben bir dosyadaki veri sayısının çok olduğunu düşündüm. Bulacağım bir şey. :)


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 16 Kasım 2014 - 22:06:44

Dosyaların yedeğini aldıktan sonra, ilgili klasörde şunu dener misiniz?

for FILE in $(find . -name '*.xls'); 
do
   TMPFILE=${FILE%.*}".csv";
   ssconvert $FILE $TMPFILE > /dev/null;
   sed -i 's/^/Fe,/' $TMPFILE;
   ssconvert $TMPFILE $FILE;
   rm $TMPFILE;
done;
Where there's a shell, there's a way.



apocuk

Mecburiyet Esaretin Diğer Adıdır.....
http://abdurrahmanakturk.wordpress.com/

ersinkandemir

Evet, lütfen yedekleyin başka bir dizine sonra deneyin.
Where there's a shell, there's a way.



apocuk

çıktılar böyle for FILE in $(find . -name '*.xls');
for: command not found
akturk@akturk[~/Desktop/Morse Clusters]
$do
bash: syntax error near unexpected token `do'
akturk@akturk[~/Desktop/Morse Clusters]
$   TMPFILE=${FILE%.*}".csv";
akturk@akturk[~/Desktop/Morse Clusters]
$   ssconvert $FILE $TMPFILE > /dev/null;

(ssconvert:20133): GLib-GObject-WARNING **: invalid (NULL) pointer instance

(ssconvert:20133): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
An output file name or an explicit export type is required.
Try --list-exporters to see a list of possibilities.
akturk@akturk[~/Desktop/Morse Clusters]
$   sed -i 's/^/Fe,/' $TMPFILE;
sed: can't read .csv: No such file or directory
akturk@akturk[~/Desktop/Morse Clusters]
$   ssconvert $TMPFILE $FILE;

(ssconvert:20138): GLib-GObject-WARNING **: invalid (NULL) pointer instance

(ssconvert:20138): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
An output file name or an explicit export type is required.
Try --list-exporters to see a list of possibilities.
akturk@akturk[~/Desktop/Morse Clusters]
$   rm $TMPFILE;
rm: cannot remove '.csv': No such file or directory
akturk@akturk[~/Desktop/Morse Clusters]
$done;^C
akturk@akturk[~/Desktop/Morse Clusters]
$^C
akturk@akturk[~/Desktop/Morse Clusters]
$./sd.sh
./sd.sh: line 1: for: command not found
./sd.sh: line 2: syntax error near unexpected token `do'
./sd.sh: line 2: `do'
akturk@akturk[~/Desktop/Morse Clusters]
$


Mecburiyet Esaretin Diğer Adıdır.....
http://abdurrahmanakturk.wordpress.com/

ersinkandemir

Doğru shellde olduğumuza emin miyiz? ??? 

echo $SHELL
ne diyor?
Where there's a shell, there's a way.



apocuk

Mecburiyet Esaretin Diğer Adıdır.....
http://abdurrahmanakturk.wordpress.com/

ersinkandemir

for komutunu niye tanımadığı hakkında fikri olan var mı? Bende çalışıyor komutlar.
Where there's a shell, there's a way.



apocuk

Mecburiyet Esaretin Diğer Adıdır.....
http://abdurrahmanakturk.wordpress.com/

ersinkandemir

for f in $(ls); do echo $f; done;

Bunu dener misiniz bi'?
Where there's a shell, there's a way.



apocuk

for f in $(ls); do echo $f; done;
bash: syntax error near unexpected token `do'
Mecburiyet Esaretin Diğer Adıdır.....
http://abdurrahmanakturk.wordpress.com/

ersinkandemir

Noktalı virgüller ile ilgili bir sıkıntı olabilir, tam alışamadım ben de Bash'in seperatorlerine. ^^ Şöyle deneyelim mi?

for FILE in $(find . -name '*.xls')
do
   TMPFILE=${FILE%.*}".csv"
   ssconvert $FILE $TMPFILE
   sed -i 's/^/Fe,/' $TMPFILE
   ssconvert $TMPFILE $FILE
   rm $TMPFILE
done
Where there's a shell, there's a way.



apocuk

Gayet güzel oldu, sizden bir ricam daha olacak dosyaların isimleri 54c.xls seklinde ben bu isimdeki ilk sayı kısmını
dosyanın ilk satırını silerek yerine yazıp bir satır boşluk ekleyerek düzenlemek istiyorum.
Birde yazdığınız kodu bana biraz açıklayabilir misiniz?
Mecburiyet Esaretin Diğer Adıdır.....
http://abdurrahmanakturk.wordpress.com/

ersinkandemir

Bu şekilde mi? Tam anlayamadım.



for FILE in $(find . -name '*.xls')
do
   TMPFILE=${FILE%.*}".csv"
   ssconvert $FILE $TMPFILE
   sed -i 's/^/Fe,/' $TMPFILE
   ssconvert $TMPFILE $FILE
   rm $TMPFILE
done


  • for FILE in $(find . -name '*.xls') ile dizin içerisindeki tüm altklasörler dahil XLS dosyalarını bulup döngüye aldık ve her seferinde dosya ismini FILE değişkenine atadık.
  • ${FILE%.*}".csv" ile atıyorum dosyanın adı 52c.xls ise 52c.csv diye bir dosya ismi oluşturduk.
  • ssconvert toolunu kullanarak XLS dosyasını CSV'ye çevirdik. Çünkü CLS dosyalarını doğrudan işlemenin kolay bir yolu yok.
  • sed ile düzenli ifadeleri kullanarak satırı manipüle ettik. ^ satır başını temsil ediyor, biz Fe, eklettik. Çünkü CSV dosyalarının yapısı "sütün1,sütün2,sütün3" şeklinde virgül(,) ile ayırmalıdır.
  • ssconvert ile tekrar XLS dosyası oluşturduk ve ardından oluşturduğumuz geçici CSV dosyasını sildik.
Where there's a shell, there's a way.



apocuk

aynen yazdığınız gibi bir format olacak birebir aynı,
ilginiz için çok tesekkur ederım buyuk bır zaman kazandırdınız bana
Mecburiyet Esaretin Diğer Adıdır.....
http://abdurrahmanakturk.wordpress.com/

ersinkandemir

for FILE in $(find . -name '*.xls')
do
    FILE_NAME=${FILE%.*}
    FILE_NUMBER=${FILE_NAME//[^0-9]/}
    TMPFILE=$FILE_NAME".csv"
    ssconvert $FILE $TMPFILE
    sed -i 's/^/Eklenecek sütun,/' $TMPFILE
    sed -i '1i'$FILE_NUMBER'\n' $TMPFILE
    ssconvert $TMPFILE $FILE
    rm $TMPFILE
done

Umarım sizde de çalışır. ^^
Where there's a shell, there's a way.



apocuk

yine uğraştırıp zamanını alacağım ama
akturk@akturk[~/Desktop/Morse Clusters]
$    sed -i 's/^/Eklenecek sütun,/' $TMPFILE
akturk@akturk[~/Desktop/Morse Clusters]
$    sed -i '1i'$FILE_NUMBER'\n' $TMPFILE
akturk@akturk[~/Desktop/Morse Clusters]
$    ssconvert $TMPFILE $FILE

(ssconvert:15920): GLib-GObject-WARNING **: invalid (NULL) pointer instance

(ssconvert:15920): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
Using exporter Gnumeric_Excel:excel_biff8
akturk@akturk[~/Desktop/Morse Clusters]
$    rm $TMPFILE
akturk@akturk[~/Desktop/Morse Clusters]
$done
bash: syntax error near unexpected token `done
Mecburiyet Esaretin Diğer Adıdır.....
http://abdurrahmanakturk.wordpress.com/

ersinkandemir

Estağfurullah, uğraşmayı seviyorum komutlarla da sende neden sorun çıkarıyor shell anlam veremedim. Bir bilenimiz var mıdır? :)
Where there's a shell, there's a way.



cagriemer

Bu satirlari teker teker terminale kopyalamaktansa basina bir shebang satiri attiktan sonra bir dosyaya kaydetseniz, sonra o dosyayi calistirilabilir yapip betik olarak calistirsaniz daha iyi olmaz mi?