Ett enkelt program för att överföra data från dbf-filer till Microsoft Excel-tabeller.
Bakgrunden till detta verktyg är följande: 1C har laddat upp data till det gamla och kraftfulla dBase-formatet, till exempel listor över varor med priser etc. etc. Så, vissa program importerar enkelt datamängder från Excel-tabeller, men de känner inte till dBase.
Upload 1c sparar data i WIN1251-kodning (naturligtvis kan detta vara konfigurerat någonstans, jag har inte kontrollerat), men efter att ha öppnat en sådan fil i Excel, visas informationen i "kryakozyabra". Detta beror på att Microsoft Excel öppnar dBase-tabeller i CP866 (DOS)-kodning som standard.
Egentligen, vad jag menar med allt detta är att det visar sig vara ett för svårt test för den genomsnittliga användaren att ta reda på hur, vad, var och med vad man ska koda om, vilka knappar man ska trycka på och vilka åtgärder man ska utföra. Det är därför uppgiften ställdes så enkelt som möjligt och omedelbart.
P.S.: Jag hävdar aldrig att det är unikt eller geni, eftersom Internet är fullt av liknande programvara som ändrar kodningar och gör mycket mer, men de flesta av dem är betalda, och den extra funktionaliteten förvärrar bara plågan för vanliga människor.
Ett program för att exportera data från dBase-filer till Microsoft Excel.
Programmets huvudfönster.
Efter att programmet har startat måste du klicka på knappen "Öppna" och i filvalsdialogrutan, välj den dbf som kommer att exporteras till Excel.
* * *
Huvudprogramfönstret med den inlästa dbf-filen.
Om filen har laddats upp kommer dess data att visas i tabellen. Högst upp, i fältet "Källfil", kommer den fullständiga sökvägen och namnet på den nedladdade dbf-filen att visas.
Efter detta måste du klicka på den stora knappen "Exportera data" som finns omedelbart under tabellen med informationen.
* * *
Fönster som ber dig skala kolumner.
Om det inte var några problem med dbf-filen bör du se ett fönster som ber dig skala kolumnstorlekarna, detta betyder om du i Excel behöver sträcka ut kolumnerna för att passa bredden på data.
* * *
Om alla operationer lyckades kommer en Excel-instans att startas med all data uppladdad till den.
Det kan hända att dbf-filen inte innehåller tjänstinformation om kodningen, i vilket fall kommer meddelandet "Dbf-filen innehåller ingen information om kodningen" att visas.
Om texten i tabellen är oläslig.
* * *
Om texten i tabellen är läsbar normalt.
Funktioner i programmet
Microsoft Excel måste vara installerat på systemet.
Dbf-filer öppnas i exklusivt läge.
Innehållet i blobfält överförs inte.
Programmets prestanda testades på Windows XP och Windows 7.
Verktyget är helt gratis och kräver ingen installation, vilket innebär att du laddar ner och använder det.
I den här artikeln kommer jag att berätta hur du laddar många enorma dbf-filer bestående av miljontals poster till din databas på en ms sql-server på en acceptabel tid.
Uppgiften är trivial vid första anblicken. Du kan använda guiden i sql management studio eller OPENROWSET-funktionen via en fråga.
Men det första alternativet togs bort efter flera försök på grund av olika fel och behovet av att ladda många filer i en tabell (cirka 100 filer). Dessutom uppstod ett fel vid laddning under lång tid.
Det andra alternativet var inte heller lämpligt på grund av drivrutinernas olika bithet och serverns bithet.
Eftersom filen helt enkelt är enorm, bestämde man sig för att läsa den genom en stream och skriva den till databasen. Därefter, efter att ha läst en rad i filen, måste du skriva in denna rad i en tabell. Det första som kom att tänka på var att använda insert, men att skriva i det här fallet skulle ta för mycket tid.
Och så kom jag ihåg en annan inspelningsmekanism via SqlBulkCopy, som låter dig ladda upp ett stort antal poster utan infogningsfrågor.
I själva verket är detta användningen av SqlBulkCopy-klassen, för att skriva genom vilken du bara behöver implementera IDataReader-gränssnittet.
Så låt oss börja med implementeringen av den offentliga klassen BDFBulkReader-gränssnittet: IDataReader
Låt oss börja med en funktion som returnerar värdet på den aktuella posten:
offentligt objekt GetValue(int i) (retur R]; )
Låt mig uppmärksamma er på att fälten i filen och fälten i tabellen kan vara i olika ordning. Och från indexet skulle jag vilja få värdet för motsvarande tabellfält. Därför använde jag dessutom FieldIndex-ordboken, där mappningen av fältnamn till siffror i SQL-tabellen. Fältnamnet tas efter nummer, och värdet från läsraden i dbf-filen tas efter namn från R-ordboken. Som ett resultat kommer GetValue för det n:e indexet i databasen att returnera motsvarande värde.
Ordbok
Vi kommer att skicka FieldIndex redan ifyllt för tabellen, och R kommer att fylla det när läsaren anropar Read-funktionen, som vi också kommer att implementera i framtiden.
Så, konstruktören:
System.IO.FileStream FS;
int FieldsLength;
System.Globalization.DateTimeFormatInfo dfi = new System.Globalization.CultureInfo("en-US", false).DateTimeFormat;
System.Globalization.NumberFormatInfo nfi = nytt System.Globalization.CultureInfo("en-US", false).NumberFormat;< FieldCount; i++) { string l = System.Text.Encoding.GetEncoding(866).GetString(buffer, Index, FieldSize[i]).TrimEnd(new char { (char)0x00 }).TrimEnd(new char { (char)0x20 }); Index = Index + FieldSize[i]; object Tr; if (l.Trim() != "") { switch (FieldType[i]) { case "L": Tr = l == "T" ? true: false; break; case "D": Tr = DateTime.ParseExact(l, "yyyyMMdd", dfi); break; case "N": { if (FieldDigs[i] == 0) Tr = int.Parse(l, nfi); else Tr = decimal.Parse(l, nfi); break; } case "F": Tr = double.Parse(l, nfi); break; default: Tr = l; break; } } else { Tr = DBNull.Value; } R.Add(FieldName[i], Tr); } ReadedRow++; return true; }
sträng Fältnamn;
sträng FieldType;
byteFieldSize;
byteFieldDigs;
Public void Dispose() ( FS.Close(); ) public int Depth ( get ( return -1; ) ) public bool IsClosed ( get ( return false; ) ) public Object this ( get ( return new object(); ) ) public Object this ( get ( return new object(); ) ) public int RecordsAffected ( get ( return -1; ) ) public void Close() ( ) public bool NextResult() ( return true; ) public bool IsDBNull(int i) ( return false; ) public string GetString(int i) ( return ""; ) public DataTable GetSchemaTable() ( return null; ) public int GetOrdinal(strängnamn) ( return -1; ) public string GetName(int i) ( returnera ""; ) public long GetInt64(int i) ( return -1; ) public int GetInt32(int i) ( return -1; ) public short GetInt16(int i) ( return -1; ) public Guid GetGuid(int i) ( returnera ny Guid(); ) public float GetFloat(int i) ( return -1; ) public Typ GetFieldType(int i) ( return typeof(string); ) public double GetDouble(int i) (retur -1; ) public decimal GetDecimal(int i) ( return -1; ) public DateTime GetDateTime(int i) ( returnera ny DateTime(); ) public string GetDataTypeName(int i) ( return ""; ) public IDataReader GetData(int i) ( returnera detta; ) public long GetChars(int i, long fieldoffset, char buffer, int bufferoffset, int length) (retur -1; ) public char GetChar(int i) ( return " "; ) public long GetBytes(int i, long fieldOffset, byte buffer, int bufferoffset, int length) ( return -1; ) public byte GetByte(int i) ( return 0x00; ) public bool GetBoolean(int i) ( return false; ) public int GetValues(Objektvärden) ( return -1; )
Där i Dispose() stänger jag helt enkelt filen.
När gränssnittet är implementerat kan du skriva en metod för att ladda filen:
Void SaveToTable(FileInfo dir, string TableName, string connestionString, Dictionary
Det är allt. Allt som återstår att skicka till den här funktionen är filplatsen, tabellnamnet, anslutningssträngen och motsvarande matchande ordbok, till exempel:
Ordbok
FieldIndex.Add(0, "POSTALCODE");
FieldIndex.Add(1, "IFNSFL");
FieldIndex.Add(2, "TERRIFNSFL");
FieldIndex.Add(3, "IFNSUL"); FieldIndex.Add(4, "TERRIFNSUL"); FieldIndex.Add(5, "OKATO"); FieldIndex.Add(6, "OKTMO"); FieldIndex.Add(7, "UPPDATERING"); FieldIndex.Add(8, "HUSNUMMER");.
Men från och med Excel 2007 ansåg Microsoft-utvecklare tyvärr att dBase var föråldrat och moderna Excel-format var för komplicerade för att lägga tid och pengar på att säkerställa full kompatibilitet. Därför behöll Excel möjligheten att läsa DBF-filer, men stödet för att spara data i detta format med inbyggda mjukvaruverktyg upphörde. Det finns dock några sätt att konvertera data som sparats i Excel till DBF genom att använda tillägg och annan programvara.
Det finns ett antal program som låter dig konvertera data från Excel till DBF. Ett av de enklaste sätten att konvertera data från Excel till DBF är att använda ett paket med verktyg för att konvertera objekt med olika tillägg WhiteTown Converters Pack.
Även om installationsproceduren för det här programmet är enkel och intuitiv, kommer vi fortfarande att uppehålla oss i detalj och peka på några nyanser.
Fliken öppnas omedelbart "Input" ("Skriva in"). Det är avsett att ange det objekt som ska konverteras. För att göra detta, klicka på knappen "Tillägga" ("Tillägga").
Om du väljer alternativet "Välj mapp", då öppnas ett förenklat katalogvalsfönster. Den visar bara mappar. Välj mappen att spara och klicka på knappen "OK".
Vi gör ett val av den typ som behövs för användning i ett specifikt program.
Det färdiga dokumentet kommer att finnas i den katalog som angavs på fliken "Produktion".
Den enda betydande nackdelen med metoden som använder verktygspaketet WhiteTown Converters Pack är att du bara kan utföra 30 konverteringsprocedurer gratis, och då måste du köpa en licens.
Du kan konvertera en Excel-arbetsbok till dBase direkt genom applikationsgränssnittet genom att installera tillägg från tredje part. En av de bästa och mest bekväma av dem är XlsToDBF-tillägget. Låt oss överväga algoritmen för dess tillämpning.
I den övre vänstra cellen anger vi namnet som vi vill tilldela den skapade DBF-filen. Den består av två delar: själva namnet och tillägget. Endast det latinska alfabetet är tillåtet. Ett exempel på ett sådant namn är "UCHASTOK.DBF".
Dessutom, i strängen ( CNN) och numerisk typ ( Nnn) efter namnet i form av en bokstav ska det maximala antalet tecken i fältet anges. Om den numeriska typen använder decimaler, måste deras nummer också anges efter pricken ( Nnn.n).
Det finns andra typer av data i dBase-format (Memo, General, etc.), men det här tillägget kan inte fungera med dem. Excel 2003 kunde dock inte fungera med dem heller, när det fortfarande stödde konvertering till DBF.
I vårt specifika fall kommer det första fältet att vara en sträng med en bredd på 100 tecken ( C100), och de återstående fälten kommer att vara numeriska, 10 tecken breda ( N10).
Du kan göra det lite enklare genom att skriva en snabbtangentskombination Alt+F8.
Som du kan se är denna metod mycket mer komplicerad än den föregående. Det är också ganska begränsat i antalet fälttyper den kan använda och antalet DBF-tilläggsobjekttyper den kan skapa. En annan nackdel är att katalogen för skapande av dBase-objekt endast kan tilldelas före konverteringsproceduren, genom att direkt flytta källfilen i Excel till målmappen. Bland fördelarna med denna metod kan det noteras att det, till skillnad från det tidigare alternativet, är helt gratis och nästan alla manipulationer utförs direkt via Excel-gränssnittet.
Även om nya versioner av Excel inte har ett inbyggt sätt att spara data i DBF-format, är alternativet att använda Microsoft Access-applikationen det som är närmast att kalla det standard. Faktum är att detta program släpptes av samma tillverkare som Excel och ingår också i Microsoft Office-paketet. Dessutom är detta det säkraste alternativet eftersom du inte behöver bråka med programvara från tredje part. Microsoft Access är speciellt utformat för att arbeta med databaser.
Det är också möjligt att importera information från enskilda intervall till ark. Men i vårt fall är detta inte nödvändigt. Ställ omkopplaren i läge "Lakan", och välj sedan det ark som vi ska hämta data från. Korrektheten av informationsvisningen kan ses längst ner i fönstret. Om allt är tillfredsställande, tryck på knappen. "Nästa".
På fältet "Filformat" välj en av tre typer av DBF-format:
Det bör beaktas att ju modernare formatet är (ju högre serienummer), desto fler möjligheter finns det att bearbeta data i det. Det vill säga att det är större sannolikhet att all tabelldata kommer att sparas i filen. Men samtidigt är det mindre troligt att programmet som du ska importera en DBF-fil till i framtiden kommer att vara kompatibelt med just denna typ.
När alla inställningar är inställda klickar du på knappen "OK".
Den skapade filen i dBase-format kommer att finnas i katalogen som specificerades i exportfönstret. Sedan kan du utföra alla manipulationer med den, inklusive importera den till andra program.
Som du kan se, trots att moderna versioner av Excel inte har möjlighet att spara filer i DBF-format med inbyggda verktyg, kan denna procedur ändå utföras med andra program och tillägg. Det bör noteras att den mest funktionella konverteringsmetoden är att använda WhiteTown Converters Pack. Men tyvärr är antalet gratiskonverteringar i den begränsat. XlsToDBF-tillägget låter dig utföra konverteringen helt gratis, men proceduren är mycket mer komplicerad. Dessutom är funktionaliteten för detta alternativ mycket begränsad.
Den "gyllene medelvägen" är metoden som använder Access-programmet. Precis som Excel utvecklades den av Microsoft och kan därför inte längre kallas en tredjepartsapplikation. Dessutom låter det här alternativet dig konvertera en Excel-fil till flera typer av dBase-format. Även om Access i denna indikator fortfarande är sämre än WhiteTown-programmet.