Bonjour,
j'ai un fichier .dat qui contient 1e6 données et j'aimerai lire et garder avec 1 pas de 100 que les 500000 données.
Qui a une idée ?
Bonjour,
j'ai un fichier .dat qui contient 1e6 données et j'aimerai lire et garder avec 1 pas de 100 que les 500000 données.
Qui a une idée ?
Pourrais-tu nous en dire un peu plus sur ce fichier ?
C'est un fichier binaire ou un fichier ascii ?
Comment sont écrites les données à l'intérieur ?
C'est un fichier ascii qui contient pas mal de données (le fichier fait 20Go) et j'aimerai le lire par morceaux au lieu de tout charger ce qui prend beaucoup de temps. En outre entre chaque lecture il doit y avoir un intervalle T=100 par exemple
Et comment sont spécifiés les paquets de données à lire ?
Tu veux lire N lignes ?
Ou bien N valeurs ? Dans ce cas, il faudrait savoir combien de valeurs sont stockées sur chaque ligne...![]()
Il n'y a qu'une seule valeur par ligne. Et je veux lire par exple N=100 000 valeurs. En outre si je lis la k-ième valeur la prochaine valeur lue est la (k+100)-ième valeur et non la (k+1).
merci au fait
Tu pourrais nous montrer les premières lignes de ton fichier ?
Les données sont-elles codées avec un nombre de digits fixés (un format du type %5.2f, par exemple ?)
Voilà un exple de mon programme:
Maintenant je veux lire et stocker mes données dans 3 vecteurs différents:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 load derivl_freq.xtt; rdw=Rand_walk(:,2); drvl=derivl_freq(:,2); clear Rand_walk derivl_freq; fgi=1e4; X_rdw=1e-24*rdw(1:fgi); X_drvl=1e-24*drvl(1:fgi); clear rdw drvl; fpi=1e7; p=(fpi+1)*(fgi-1) t0=1e0; k1=1/(2*sqrt(2)*pi); k2=2*pi; k3=2*pi; X1=k1*randn(1,1); X2=k2*X1; X3=k3*X2; %%%création d'un fichier fifi contenant les données bruit.dat%%%%%%%%%%%%%%%%%%%%% fifi=fopen('bruit_HM.dat','w'); for gdi=1:fgi-1 a=(X_rdw(gdi+1)-X_rdw(gdi))/fpi; b=X_rdw(gdi); for pti=0:fpi supi=gdi*pti+1; X1=1e-24*randn(1,1); X2=X2+k2*X1; sy1=a*pti+b+5e-12*X1+1e-14*X2; fprintf(fifi,'%16.6e\n',sy1); end fclose(fifi); clear X_rdw X_drvl;
le premier (A) contiendra 100.000 valeurs avec 1 valeur tous les 1s;
le second(B) contiendra 100.000 données avec 1 donnée tous les 100s
et le troisième(C)contiendra 100.000d onnées avec 1 donnée tous 10000s
j'espére que c'est compréhensible.
As-tu envisagé d'écrire le fichier en binaire plutôt qu'en ascii ?
C'est dans un cas comme le tient que cela prend tout son intérêt...
Non et je ne saisit pas bien pourquoi le mettre en bin et ce sera quoi la différence avec ce que je veux en faire.
Il y a plusieurs bonnes raisons mais un exemple sera plus parlant :
La taille du fichier binaire sera plus petite :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 % Des données X = rand(3500,1)*1E5; % Sauvegarde dans un fichier ascii fid = fopen('data.txt','wt'); fprintf(fid,'%16.6f\n',X); fclose(fid); % Savegarde dans un fichier binaire fid = fopen('data.bin','w'); fwrite(fid,X,'double'); fclose(fid);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 % Comparaison des tailles des fichiers d = dir('data.txt'); s(1) = d.bytes; d = dir('data.bin'); s(2) = d.bytes; fprintf('Fichier ascii : % d octets\nFichier binaire : % d octets',s)Il est possible d'enregistrer les données sans les altérer en binaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Fichier ascii : 59500 octets Fichier binaire : 28000 octets
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 % Récupération des valeurs depuis le fichier ascii XX = load('data.txt','-ascii'); % Récupération des valeurs depuis le fichier binaire fid = fopen('data.bin','r'); YY = fread(fid,'double'); fclose(fid); % Comparaison entre les données initiales et les données lues en ascii all(X==XX) % Comparaison entre les données initiales et les données lues en binaire all(X==YY)Et surtout, il est très simple de lire des données par bloc en binaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 ans = 0 ans = 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 % Lecture d'une valeur sur deux dans le fichier binaire step = 2 fid = fopen('data.bin','r'); YY = fread(fid,[1,inf],'double',(step-1)*8); fclose(fid);Les fichiers ascii ne sont utiles que si il doivent être écrits/lus/modifiés à la main par un humain. Dans tous les autres cas, le fichier binaire est bien plus puissant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 >> X(1:8) ans = 1.0e+04 * 8.091444965348030 4.951193479162868 9.821348341539357 3.927156635209331 4.988231394683770 3.699115696408600 2.540006152851767 3.102642743928413 >> YY(1:4) ans = 1.0e+04 * 8.091444965348030 9.821348341539357 4.988231394683770 2.540006152851767
Et j'oubliais, les fichier binaires sont portables d'une plateforme à une autre, pas les fichiers ascii.
Il suffit d'ouvrir sous Linux un fichier texte créé sous Windows... y'a généralement un joli carré à la fin de chaque ligne![]()
Merci pour l'éclairage sur fichier binaire et ascii mais mon probleme demeure toujours pour ce qui concerne la lecture et le stockage par morceau
Je crois que j'ai raté la promotion des fichier binaires sur ce coup la
Comme tu veux... mais vu la taille de tes fichiers, je doute que tu sois satisfais du temps de lecture...
Voici une solution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 % Des données X = rand(20,1)*1E5; % Sauvegarde dans un fichier ascii fid = fopen('data.txt','wt'); fprintf(fid,'%16.6f\n',X); fclose(fid); % Lire 2 valeur avec un saut de 5 valeurs % Valeur lues : 1 2 ; 6 7 ; 11 12 ; 16 17 fid = fopen('data.txt','rt'); step = 5; num = 2; k = 1; while ~feof(fid) Y(k,:) = fscanf(fid,'%f',[1,num]); k = k+1; for n = 1:step-num+1 fgetl(fid); end end fclose(fid); [X([1 2 ; 6 7 ; 11 12 ; 16 17]) Y]
Mais non t'as pas raté la promotion des fichier binaires bien au contraire. C'est que j'ai pas l'habitude de les utiliser. Pour ton exemple si je comprends il suffit de changer le step pour avoir le saut désiré.
est-ce-possible d'avoir comme valeurs lues:[1; 6; 11; 16 ;21] au lieu de [1 2 ; 6 7 ; 11 12 ; 16 17] et pour finir num=2 c'est quoi son rôle.
Réponse 1 : il suffit de mettre num=1 (l'exemple fonctionne pour des blocs)
Réponse 2 : voir la réponse 1
Sinon une version légèrement optimisée :
A tester bien entendu...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 % Des données X = rand(20,1)*1E5; % Sauvegarde dans un fichier ascii fid = fopen('data.txt','wt'); fprintf(fid,'%16.6f\n',X); fclose(fid); % Lire 2 valeur avec un saut de 5 valeurs % Valeur lues : 1 2 ; 6 7 ; 11 12 ; 16 17 fid = fopen('data.txt','rt'); step = 5; num = 2; len = 16; if isunix eof=1; else eof = 2; end k = 1; while ~feof(fid) temp = fscanf(fid,'%f',[1,num]); if temp Y(k,:) = temp; k = k+1; else break end fseek(fid,eof+(16+eof)*(step-num),'cof'); end fclose(fid);
Alors dans ce cas très simple, je ne résiste pas à l'idée de soumettre à nouveau le bon vieux format binaire
C'est plus simple non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 X = rand(20,1)*1E5; fid = fopen('data.bin','w'); fwrite(fid,X,'double'); fclose(fid); % Lire une valeur avec un saut de 5 valeurs % Valeur lues : 1 ; 6 ; 11 ; 16 fid = fopen('data.bin','r'); step = 5; Y = fread(fid,'double',(step-1)*8); fclose(fid); [X([1 ; 6 ; 11 ; 16]) Y]
est-il possible d'insérer N comme suis temp = fscanf(fid,'%f',[1,num],N); pour dire qu'on stocke N valeurs? et je pense qu'il faut utiliser fwrite et fread pour tes fameux binairesque je vais essayer d'utiliser dorénavant
Et pour lire par bloc en binaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 X = rand(20,1)*1E5; fid = fopen('data.bin','w'); fwrite(fid,X,'double'); fclose(fid); % Lire 2 valeur avec un saut de 5 valeurs % Valeur lues : 1 2 ; 6 7 ; 11 12 ; 16 17 fid = fopen('data.bin','r'); step = 5; num = 2; k = 1; while ~feof(fid) temp = fread(fid,num,'double'); if temp Y(k,:) = temp; k = k+1; fseek(fid,(step-num)*8,'cof'); else break end end fclose(fid); [X([1 2 ; 6 7 ; 11 12 ; 16 17]) Y]
Ok ça marche maintenant je vais mettre des fichier.bin partout pour me faire plus d'espace en tout cas merci pour tout DUT t'as réussi à me convertir en fichier.binJe vais maintenant essayer de digérer tout ça.
Salut dut, Dans le programme ci-dessous que tu m'as envoyé hier
je ne veux pas lire jusqu'à la fin du fichier symbolisé par while ~feof(fid) mais j'aimerai plus tôt m'arrêter après avoir lu par exemple N=10000 valeurs j'y ai passé toute ma nuit et j'y suis pas arrivé, t'aurais pas une idée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 % Des données X = rand(20,1)*1E5; % Sauvegarde dans un fichier ascii fid = fopen('data.txt','wt'); fprintf(fid,'%16.6f\n',X); fclose(fid); % Lire 2 valeur avec un saut de 5 valeurs % Valeur lues : 1 2 ; 6 7 ; 11 12 ; 16 17 fid = fopen('data.txt','rt'); step = 5; num = 2; k = 1; while ~feof(fid) Y(k,:) = fscanf(fid,'%f',[1,num]); k = k+1; for n = 1:step-num+1 fgetl(fid); end end fclose(fid); [X([1 2 ; 6 7 ; 11 12 ; 16 17]) Y]
Partager