Einlesen einer .vcf datei und zerlegen des textes



  • Hallo zusammen,

    ich bin neu zu c++ und mfc

    Mein vorhaben:
    Ich will mir ein Vcard datei einlesen und sie zerlegen und dann in ein editbox zuweisen.

    BEGIN:VCARD
    N:Weidtmann;Muster;
    FN: Muster Weidtmann
    BDAY:
    TEL;FAX:02222/22-2014
    TEL;HOME:
    TEL;CELL:
    TEL;WORK:02222/22-2343
    EMAIL;INTERNET:muster.weidtmann@dtest.com
    ADR;WORK:;;Bonner Str. 122 ;Muss;;51389;Deutschland
    ORG:Dtest GmbH, Muss;
    TITLE:
    END:VCARD

    soll so zerlegt werden wie :
    Name -> N
    Vorname -> FN
    Geburtstag -> BDAY

    und später in dem entsprechendes zugeordnet werden.

    Irgendwie komme ich nicht weiter.. kann mir jemand mal helfen, bitte.

    Das ist der code den ich bis jetz geschafft habe, 🙄

    CString strFileName;
    
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    	CFileDialog SampleDlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"vCard Datei(*.vcf)|*.vcf||");
        int iRet = SampleDlg.DoModal();
    
        strFileName = SampleDlg.GetPathName(); // Filepath mit Filename
    
    	SetDlgItemText(IDC_File, strFileName); // ausgeben der filepath+filename in den IDC_File
    
    	char str[1000], *token[80];
    
    	CString zeile;
    
    	UINT nActual = 0;
    
    	CStdioFile datei( strFileName, CFile::modeRead ); // Datei lesen
    
    	 int i = 0;
    
    	 while(datei.ReadString(zeile)> 0)
    	 {
    		datei.ReadString(str,'\n');
    		//zeile = str;
    
    		token[0] = strtok(str, ":");
    		while(token[i]!= NULL) {   //ensure a pointer was found
            i++;
            token[i] = strtok(NULL, ":"); //continue to tokenize the string
    
    		}
    
    		int a;
    		for(a = 0; a < 2; a++)
    		{
    			if(token[a] == "BDAY:"){
    				SetDlgItemText(IDC_OM, token[a+1]);
    			}
    					if(token[a] == "TEL;FAX:"){
    				SetDlgItemText(IDC_OM, token[a+1]);
    			}
    							if(token[a] == "TEL;HOME:"){
    				SetDlgItemText(IDC_OM, token[a+1]);
    			}
    									if(token[a] == "TEL;CELL:"){
    				SetDlgItemText(IDC_OM, token[a+1]);
    			}
    		}
    	 }  
    
    	datei.Close();
    


  • okay ich kaam schon weiter, falls es jemanden interessiert, hier ist der Code.
    Ist noch nicht ganz fertig. Aber soweit funktioniert es bei mir.

    Vielleicht habt Ihr ja eine professionellere Lösungsvorschlag.

    CString strFileName;
    
    // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    CFileDialog SampleDlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"vCard Datei(*.vcf)|*.vcf||");
    int iRet = SampleDlg.DoModal();
    
    strFileName = SampleDlg.GetPathName(); // Filepath mit Filename
    
    SetDlgItemText(IDC_File, strFileName); // ausgeben der filepath+filename in den IDC_File
    
    char str[1000], *tokenz[20], *tokend[30];
    
    CString m_strEdit1;
    UINT nActual = 0;
    
    CFile datei( strFileName, CFile::modeRead );
    
    nActual = datei.Read( str, sizeof( str ) );
    str[nActual] = 0;
    datei.Close();
    m_strEdit1 = str;
    
    		int i= 0;
    		int x = 0;
    		int y = 0;
    
    		tokenz[0] = strtok(str, "\n");
    			while(tokenz[i]!= NULL)
    			{   
    				i++;
    				tokenz[i] = strtok(NULL, "\n"); //Trennen nach satz ende
    			}
    
    		for(int a = 0; a < 12; a++)
    		{
    
    			tokend[y] = strtok(tokenz[a], ":");
    				while(tokend[x]!= NULL)
    				{   
    					x++;
    					tokend[x] = strtok(NULL, ":"); //Trennen nach doppelpunkt
    				}
    			y = y + 2;
    		}
    
    		for(int z = 0; z < 30; z++)
    		{	
    			CString actToken = tokend[z];
    			if(actToken == "N"){
    				SetDlgItemText(IDC_N1, tokend[z+1]);
    			}
    			if(actToken == "FN"){
    				SetDlgItemText(IDC_FN1, tokend[z+1]);
    			}
    			if(actToken == "BDAY"){
    				SetDlgItemText(IDC_BDAY1, tokend[z+1]);
    			}
    			if(actToken == "TEL;FAX"){
    				SetDlgItemText(IDC_TELFAX1, tokend[z+1]);
    			}
    			if(actToken == "TEL;HOME"){
    				SetDlgItemText(IDC_TELHOME1, tokend[z+1]);
    			}
    			if(actToken == "TEL,WORK"){
    				SetDlgItemText(IDC_TELWORK1, tokend[z+1]);
    			}
    			if(actToken == "TEL;CELL"){
    				SetDlgItemText(IDC_TELCELL1, tokend[z+1]);
    			}
    			if(actToken == "EMAIL;INTERNET"){
    				SetDlgItemText(IDC_EMAIL1, tokend[z+1]);
    			}
    			if(actToken == "ADR;;WORK"){
    				SetDlgItemText(IDC_ADRESSWORK1, tokend[z+1]);
    			}
    			if(actToken == "ORG"){
    				SetDlgItemText(IDC_ORG1, tokend[z+1]);
    			}
    
                                         .
                                         .
                                         .
                                         .
    
    		}
    


  • Ein Verbesserungsvorschlag: eine std::map<CString,UINT>, wo du die Tokens und die dazugehörige Dialog-Item-ID verknüpfst. Das Befüllen dieser Map kannst du in eine eigene Funktion auslagern. Macht die Sache insgesamt lesbarer, und falls zusätzliche Dinger dazukommen, einfach anfügen.


Anmelden zum Antworten