som man kan se, er der et 3'grads tegn (håber jeg).. Filen er i sig selv encoded i ANSI charset
og når jeg læser filen i C#, bliver dataene også læst rigtigt og alting ser rigtigt ud...
lige indtil de ligger i databasen !
herinde bliver alle specialtegn lavet om til �
2 35 K11060 1 0 7 Hubraum: 79 cm�
2 35 K11060 4 0 7 Displacement: 79 cm�
min database kører standard "Dansk", så spørgsmålet er om jeg skal konvertere tegnene inden jeg indsætter dem - eller kan jeg lave nogle indstillinger i min connectionstring ?
Hvis kolonnen i databasen er af typen VARCHAR eller CHAR, er det ikke sikkert du kan få tegnet med. Denne type bruger databasens karaktersæt. Prøv i stedet at lave datatypen om til NVARCHAR eller NCHAR, dette er en unicode datatype, den skal kunne indeholde alle tegn.
---------------------- GetDataTable opretter et DataTable nogenlunde sådan her :
SqlCommand comm = new SqlCommand( "select column_name, data_type from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '" + dv.Value.DestinationTable + "'", conn ); SqlDataReader reader = comm.ExecuteReader(); DataTable dt = new DataTable();
while (reader.Read()) { switch (reader[1] as string) { case "int": dt.Columns.Add(reader[0] as string, typeof(int)); break; case "bigint": dt.Columns.Add(reader[0] as string, typeof(Int64)); break; case "float": dt.Columns.Add(reader[0] as string, typeof(double)); break; case "datetime": dt.Columns.Add(reader[0] as string, typeof(DateTime)); break; case "varchar": dt.Columns.Add(reader[0] as string, typeof(string)); break; case "nvarchar": dt.Columns.Add(reader[0] as string, typeof(string)); break; case "uniqueidentifier": dt.Columns.Add(reader[0] as string, typeof(Guid)); break; default: throw new Exception("Error in casting: " + reader[1]); } }
---------------------- Hvorefter DataTable't bliver fyldt med 10.000 rækker data:
foreach(var line in lines.Take(10000)) { dt.Rows.Add(line.Split('|').ToItemArray(dt)); }
---------------------- funktionen ToItemArray tager et stringArray og returner et ObjectArray efter de Typer som er defineret i DataTablet:
public static object[] ToItemArray(this string[] arr, DataTable dt) { object[] output = new object[arr.Length];
for (int i = 0; i < arr.Length; i++) { switch (dt.Columns[i].DataType.ToString()) { case "System.Int32": switch (arr[i]) { case "": output[i] = 0; break; default: output[i] = Convert.ToInt32(arr[i]); break; } break; case "System.Int64": output[i] = Convert.ToInt64(arr[i]); break; case "System.Double": switch (arr[i]) { case "": output[i] = 0; break; default: output[i] = Convert.ToDouble(arr[i]); break; } break; case "System.DateTime": if (arr[i].Length == 8) output[i] = DateTime.ParseExact(arr[i], "yyyyMMdd", null); else output[i] = DateTime.Now.AddDays(365); break; case "System.String": output[i] = arr[i]; break; case "System.Guid": output[i] = new Guid(arr[i]); break; default: throw new Exception(dt.Columns[i].DataType.ToString()); } }
Jeg kan desværre ikke lige se hvorfor det ikke virker. Det eneste bud jeg har, er stadig at det har noget med karaktersættet at gøre. Men hvis du kan copy/paste det ind, er det lidt mærkeligt!
Mærkeligt ... men out of the blue comments må være følgende.
hmmm, har du for sjov prøvet andre Encodings selvom det måske ser fint ud i programmet ... kan jo ske at det går galt når det skal ind i databasen ...
ASCII burde være hvad der svarer til ANSI ... efter som hvad jeg lige kunne læse mig til at ANSI er et udvidet ASCII charset måske forkert ... men det var hvad google lige gav mig.
Så Default er nok det systemet normalt bruger ... og jo ikke sikkert det er den encoding du har gemt det i hvis du specifikt siger det skal være ANSI.
1. StreamReader sættes til at læse med Encoding.Default + autodetect 2. Linien i filen læses med CurrentEncoding og konverteres til Unicode Byte[] 3. byte[] konverteres tilbage til String
StreamReader sr = new StreamReader(dv.Value.DestinationTable + ".tbl", Encoding.Default, true);
while (!sr.EndOfStream) { string line = Encoding.Unicode.GetString(Encoding.Convert(sr.CurrentEncoding, Encoding.Unicode, sr.CurrentEncoding.GetBytes(sr.ReadLine())));
Er følgende så ikke nemmere eller er der noget jeg har overset: StreamReader reader = new StreamReader(path, Encoding.Unicode, true);
nej - for hvis filen er skrevet med UTF8 så skipper din StreamReader den encoding du giver den og finder selv ud af det ved at læse de første bytes af filen.
når en StreamReader læser filen, bliver streng-outputtet til Unicode - men selvom det er unicode, findes der flere placeringer af æøå hvilket kan give fejl senere hen.
Encoding.Default er Win1252 hvilket ikke er præcis det samme som ANSI eller ASCII
> Så du siger man burde sætte den til false istedet for true ...
nej jeg gør ikke :)
> for det virker lidt som om der noget helt galt her hvis det ikke kan gøres i første hug.
ja det syntes jeg også... men det var sgu strengen som var fucked
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.