Łączenie dwóch plików txt po wspólnej wartości

0

Witam!
Proszę o pomoc, mam dwa pliki tekstowe: jeden, który zawiera nr zamowienia, opis zamowienia oraz warunki gwarancji oraz drugi plik, ktory codziennie sie zmienia i zawiera nr zamowienia, date i godzine zaowienia.(petle do czytania co jest co mam i mysle zeby laczyc jakos po numerze zamowienia ktore beda zmiennymi) Sprawa polega na tym zeby polaczyc te dwa pliki w jeden zeby bylo nr zamowienia i od razu po tym data, godzina, opis i gwarancja. Taki pliczek planuje sobie wrzucic do zaplanowanych zadan w windowsie zeby raz dziennie robil taki zlepek, tylko za cholere nie wiem jak polaczyc te dwa pliki zeby do konkretngo numeru zamowienia przypisalo konkretny opis i wyrzucilo do trzeciego pliku. Z góry dzięki za jakieś pomysły lub najbardziej by sie przydal fragment kodu co przydziela dane z jednego pliku do drugiego.

0

pokaż przykładowe pliki.

0

Chodzi o to ze w pierwszym pliku jest cos takiego np:
1234 opis1 gwarancja1
1235 opis2 gwarancja2

a w drugim pliku:

1234 12/07/2012 12:03
1235 12/07/2012 16:03

chodzi o to zeby zrobic trzeci plik aby wygladal tak:
1234 12/07/2012 12:03 opis1 gwarancja1
1235 12/07/2012 16:03 opis2 gwarancja2

Przy czym plik piwerszy sie nie zmienia bo zawiera dane ktore sie nie zmieniaja, a drugi zmienia sie raz dziennie.
Chce to jakos polaczyc zeby ladnie chodzilo bo w kazdym pliku jest kolo 2000 wpisow

0

jak cos moge jutro z pracy wyslac kod, obczaicie co i jak, brakuje mi tego polaczenia w programie a nie wiem jak sie za to zabrac

0
  • otwórz plik1
  • wczytaj id z pierwszego pliku (np 1234)
  • otwórz plik2
    szukanie_linijki:
  • wczytaj id2 z plik2
  • jeśli id2 != id - wczytaj resztę znaków do końca linii i skocz do szukanie_linijki
  • jeśli w plik2 nie ma takiego id - no to d*pa :P
  • zapisz id do plik3, po czym resztę linijki z plik2 i resztę linijki z plik1
    Powtarzaj do skutku.
0

Chyba lepiej będzie wczytać krótszy z nich do pamięci do tablicy struktur, posortować wg numeru.
Czytając drugi wiersz po wierszu, znaleźć metodą połowienia odpowiedni numer i zapisać wiersz.

albo

Posortować oba pliki.
jest komenda w PS i w unixie
A dalej ich scalać:

  • wczytujesz pierwsze wiersze z obu plików.
  • w pętle
  • jeżeli numery są równe to mamy kolejny scalony rekord, wczytujemy dwa kolejne wiersze.
  • jeżeli numery różne to mniejszy z nich NIE MA odpowiednika w drugim pliku, coś robimy z tym fantem i wczytujemy kolejny wiersz z pliku skąd pochodził mniejszy numer.
  • powtarzać do wyczerpania jednego z plików.
0

k mam kilka pytan, rozumiem ze z pierwszego pliku id czyli numer zamowienia mam ustawic jako zmienna id, tylko teraz sprawa deklaracji, bo jest np. 2000 takich id i nie chce kazdego po kolei deklarowac to samo tyczy sie drugiego pliku, tutaj nie mam kodu ale wrzuce jutro, powiedzmy ze mam petle ktora daje numer jako id i teraz nie wiem dokladnie jak napisac szukanie tego numeru, chodzi mi o tn fragment kodu, jak mozecie podajcie jakis standarodwy przyklad. Dzieki za podpowiedzi jutro bede wlaczyl jak cos bede jeszcze meczyl. Pozdrowienia

0

_13th_Dragon bede wdzieczny za krotkie wyjasnienie metody polawiania.Niestaty dostalem zadanie ktore mnie troche przeroslo, bo nie to jest moim obowiazkiem ale powoli robie tylko sie zacialem na tym wyszukiwaniu;p mysle ze najlepiej jak wlasnie wszysttam ten plik staly do tablicy i dalej jakos to wyszukac.

0

Jeden problem wyszedl i sie na nim zatrzymalem. W tym pliku z opisem i gwarancja i jest tak kolorowo ze nr jest pod numerem tylko czasem opis jest dluzszy chodzi mi o to:
1234 opis1opis1opis1opis1opis1opis1opis1
opis1opis1opis1opis1opis1opis1opis1opis1
opis1opis1opis1opis1opis1opis1opis1opis1;
1235 opis2opis2opis2opis2opis2opis2opis2
opis2opis2opis2opis2opis2opis2opis2opis2
opis2opis2opis2opis2opis2opis2opis2opis2;

czyli teraz chodzi mi tylko o jedna rzecz, z drugiego pliku mam numer zamowienia i jak go porownac wyszukac taki sam numer w takim pliku i zeby wrzucalo wszystko po znalezieniu numeru do srednika. Gdyby te numery byly pod soba to by jakos poszlo ale na to nie mam pomyslu.

0

A nie lepiej ci zapisac to w strukturach ?

struct rekord
{
int id;
char data[17];
char gwarancja[501];
};

rekord r;
r.id = 5;
strcpy(r.data,"12/07/2012 16:03\0");
strcpy(r.gwarancja,"jakis tekst\0");

gdy juz otworzysz plik funkcja fopen z parametrem b jako plik binarny

zapisujesz
fwrite((char*)&rekord,sizeof(rekord),1,plik);

nie lepiej i wygodniej?

0

Pomocy jeszcze, ostatni for nie dziala nie wiem dlaczego i jak polaczyc dane z pliku inc z incbaza i od razu zapisac do pliku 3. Nie wiem czemu ten for nie idzie.

#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<Math.h>
#include<string>
#include<fstream>
using namespace std;

int main(void)
{ 

fstream plik("C:\\Documents and Settings\\ania\\Pulpit\\inc.txt",ios::in);
if (plik.good()==true){
    cout<<"Uzyskano dostep do pliku"<<endl;}
string dane[3000],nr_zamowienia[3000],opis[18000],nr_zam[18000],opisy[18000];          
int liczba_wierszy=0,i;

    char cos[9999]; 
     do {
    plik.getline(cos,sizeof(cos));
    liczba_wierszy++;}
    while(!plik.eof());


plik.close();
fstream plik2("C:\\Documents and Settings\\ania\\Pulpit\\inc.txt",ios::in);


for(i=0;i<=liczba_wierszy;i++){

getline( plik2, dane[i] );

}
//cout<<dane[0];
for(i=1;i<liczba_wierszy-1;i++)
{ 
dane[i].erase(84,140-84);
dane[i].erase(55,71-55);
dane[i].erase(28,51-28);
dane[i].erase(0,10-0);
if(dane[i].find("error")==string::npos)
dane[i].erase(22,51-22);

//cout<<dane[i]<<endl;
}          
for(i=1;i<liczba_wierszy-1;i++)
{

nr_alarmu[i]=dane[i].erase(22,50-22);
nr_alarmu[i].erase(0,18-0);
//cout<<nr_zamowienia[i]<<endl;
}



fstream plik3("C:\\Documents and Settings\\ania\\Pulpit\\incbaza.txt",ios::in);

if (plik3.good()==true){
    cout<<"Uzyskano dostep do pliku3"<<endl;}

float liczba_lini=0;
int j;

    char coscos[99999]; 
     do {
    plik3.getline(coscos,sizeof(coscos));
    liczba_lini++;}
    while(!plik3.eof());

//cout<<"liczba lini   "<<liczba_lini<<endl;

plik3.close();
fstream plik4("C:\\Documents and Settings\\ania\\Pulpit\\incbaza.txt",ios::in);
fstream plik_dane("C:\\Documents and Settings\\ania\\Pulpit\\raport.txt",ios::out);

for(j=0;j<=liczba_lini;j++){
getline( plik4, opis[j] );
//cout<<opis[j]<<endl;

}

for(j=0;j<liczba_lini;j++)
{ opisy[j]=opis[j];
nr_zamowienia[j]=opisy[j].erase(4,200-4);
//cout<<nr_zam[j]<<endl;
//plik_dane<<nr_zam[j]<<endl;
//plik_dane<<opis[j]<<endl;
} 


getch();


for (i=1;i<liczba_wierszy;i++)
{
        for (j=0;j<=liczba_lini;j++)
        {
                if (nr_zamowienia[i] == nr_zam[j]){
                                 opis[j].erase(0,4-0);
                                 
                                 
                                 cout<<opis[j]<<endl;
                                 }
                                 getch();} }


plik2.close();
plik4.close();
plik_dane.close();    
   
 
    getch();
    return 0;
}
0

Nie mam czasu na dokładne przeglądnięcie, ale używasz tablicy nr_alarmu, która nie istnieje

0

Chcialem zrobic prosciej ale sie okazalo ze ten plik co sie zmienia codziennie ma troche inna budowe a mianowicie cos takiego:

(001da7b5)16/05/11 00:52:27 001001M|00/11/-/---|=2:2000=INT-IP Ethernet error code 2 (status 1 0 0x00 0x00 0x00)
(001da7b6)16/05/11 00:53:37 001001M|00/11/-/---|=2:2001=INT-IP Ethernet error code 2 (status 1 0 0x00 0x00 0x00)
(001da7b7)16/05/11 00:54:03 001001M|00/11/-/---|=4:2002=Boot event 3, status:0,0,0
(001da7b8)16/05/11 00:55:14 001001M|00/11/-/---|=2:2000=INT-IP Ethernet error code 2 (status 1 0 0x00 0x00 0x00)
(001da7b9)16/05/11 00:56:24 001001M|00/11/-/---|=2:2002=INT-IP Ethernet error code 2 (status 1 0 0x00 0x00 0x00)

i dlatego nie jest tak latwo wyciagnac tych wartosci co mnie interesuja czyli daty godziny i numeru bo reszta mnie nie interesuje i nie umiem tego tak prosto zrobic.
z drugim plikiem jest prosciej bo wyglada tak(fragmentnumerow 2000, 20001,2002):do tego nie zawsze sa po kolei np czasem jest opuszczone duzo numerow.

2000 " Critical IO1 driver not responding"
"Failure of the IO1 driver start"
"Bad IO1 initialization owed to a software version incoherence."
"Reset of the CPU-IO1 block, unusable as it is. Cyclically, the reset might be"
"activated again, for the situation could not have changed on its own."
"Check the versions of the installed software.";
2001 " Major No identity of IO1 is coming";
2002 " Critical Not answer from the download of IO1"
"IO1 board download has failed"
"When the IO1 board appears, the telephone task requests the download of"
"the board IO1. The download takes over to ensure the download. When this"
"is over, the download sends a report of the download (OK or KO). The"
"incident appears if the telephone task receives no report from the download."
"The initialization of IO1 stops and the system cannot start."
"Check whether the download task has been executed (command ps). The incident"
"may be preceded by incident IO1 or by download (incident 2500 to 2523). Note"
"these incidents too.";

i numer i opis sie jakos wyciagnie ale nie wiem jak z tym pierwszym .
Nie mam juz zadnego pojecia naprawde jak to napisac i polaczyc...

0

no tak ale nie umiem ich wyciagnac innazcej niz tak zeby wczytac od razu plik i dopiero w programie wyciagac, jak mozesz mi podac fragment kodu zeby mi wyciagal od razu date godzine i numer to bylbym wdzieczny bo to wykracza poza moje mozliwosci juz..

0
prajmus napisał(a)

Nie mam czasu na dokładne przeglądnięcie, ale używasz tablicy nr_alarmu, która nie istnieje

sorry wstawilem taki plik roboczy, najpierw probowalem na innych pozniej zaczalem przerabiac program na tamte, po prostu ta wersje wyslalem sobie do domu z pracy ale jak mam te same nazwy tablic i tak nic nie idzie.

0
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<Math.h>
#include<string>
#include<fstream>
#include<cstdlib>
using namespace std;

int main(void)
{ 
fstream plik_dane("C:\\Documents and Settings\\ania\\Pulpit\\raport.txt",ios::out);
fstream plik("C:\\Documents and Settings\\ania\\Pulpit\\inc.txt",ios::in);
if (plik.good()==true){
    cout<<"Uzyskano dostep do pliku"<<endl;}
string dane[3000],nr_alarmu[3000],opis[18000],nr_alarm[18000];          
int liczba_wierszy=0,i,liczba[3000],liczba2[18000];

    char cos[9999]; 
     do {
    plik.getline(cos,sizeof(cos));
    liczba_wierszy++;}
    while(!plik.eof());


plik.close();
fstream plik2("C:\\Documents and Settings\\ania\\Pulpit\\inc.txt",ios::in);


for(i=0;i<=liczba_wierszy;i++){

getline( plik2, dane[i] );

}
//cout<<dane[0];
for(i=1;i<liczba_wierszy-1;i++)
{ 
dane[i].erase(84,140-84);
dane[i].erase(55,71-55);
dane[i].erase(28,51-28);
dane[i].erase(0,10-0);
if(dane[i].find("error")==string::npos)
dane[i].erase(22,51-22);

//cout<<dane[i]<<endl;
}          
for(i=1;i<liczba_wierszy-1;i++)
{

nr_alarmu[i]=dane[i].erase(22,50-22);
nr_alarmu[i].erase(0,18-0);
liczba[i] = atoi(nr_alarmu[i].c_str());
//plik_dane<<liczba[i]<<endl;
//cout<<nr_alarmu[i]<<endl;

}



fstream plik3("C:\\Documents and Settings\\ania\\Pulpit\\incbaza.txt",ios::in);

if (plik3.good()==true){
    cout<<"Uzyskano dostep do pliku3"<<endl;}

float liczba_lini=0;

int j;

    char coscos[999999]; 
     do {
    plik3.getline(coscos,sizeof(coscos));
    liczba_lini++;}
    while(!plik3.eof());

cout<<"liczba lini   "<<liczba_lini<<endl;

plik3.close();
fstream plik4("C:\\Documents and Settings\\ania\\Pulpit\\incbaza.txt",ios::in);


 for(j=0;j<=liczba_lini;j++){    
for(j=0;j<=liczba_lini;j++){
getline( plik4, opis[j],';' );
nr_alarm[j]=opis[j];
nr_alarm[j].erase(5,4294967295-4);
liczba2[j] = atoi(nr_alarm[j].c_str());
//plik_dane<<liczba2[j]<<endl;
//plik_dane<<nr_alarm[j]<<endl;
//plik_dane<<opis[j]<<endl;
break;}break;}



for (i=1;i<liczba_wierszy;i++)

{
       for (j=0;j<=liczba_lini;j++)
    
     
       {
                if (liczba[i]==liczba2[j]){
                                 
                                    
                               plik_dane<<dane[i]<<opis[j]<<endl;
                                // cout<<opis[j]<<endl;
                               //  getch();
                                 }
                               break; } break;
break;}


plik2.close();
plik4.close();
plik_dane.close();    
   
 
    getch();
    return 0;
}

ostatni if nie dziala, nie mam pojecia dlaczego, ktos cos podpowie?

0

Wow, jakieś mocno nieortodoksyjne formatowanie stosujesz.

for (i = 1; i < liczba_wierszy; i++) {
    for (j = 0; j <= liczba_lini; j++) {
        if (liczba[i] == liczba2[j]) {
            plik_dane << dane[i] << opis[j] << endl;
            // cout<<opis[j]<<endl;
            //  getch();
        }
        break;
    }
    break;
    break;
}

No, to.. WTF?

0

dobra ten ostatni for jest pokombinowany ale nie wiem czemu program w ogóle nawet do niego nie przechodzi, moge przed nim nawet sobie wrzucic glupie cout<<"siema"; i i tak nie wyswietli i nie wiem co go blokuje, program nie dochodzi do ostatniego fora

0

To wrzuć trochę wcześniej, znajdź fragment w którym program działa nie tak jak według Ciebie powinien, sprawdź jak wyglądają zmienne i będziesz wiedział czemu nie idzie ci dalej, ewentualnie która pętla nie działa tak jak byś chciał.

1 użytkowników online, w tym zalogowanych: 0, gości: 1