最近在做一個天氣預報模塊,首先需要將客戶端公網ip轉換成所在城市,然後將所在城市名轉換成對應的城市代碼,在網上找到了城市代碼,但是需要處理一下,看了看,有三百多城市及對應的城市代碼,想存到數據庫。就想著做一個數據處理自動生成sql語句的工具,提高效率。
城市代碼一看上去很亂的,而且對應關系是每個省城市一行,代碼一行,分別用引號引起,用逗號分隔,每行間都沒有符號分隔,省名沒有用引號。首先是想著把省名去掉,因為每個城市名都是不相同的。想著每兩行兩行的去處理,但是也要費不少功夫,還容易出錯。就想個索性一次性的全處理的算法。
ps:界面很簡單,上面是輸入數據,中間是轉換,下面是輸出數據。
後台主要代碼:
private void button1_Click(object sender, EventArgs e) { string data = textBox1.Text.Replace("\r", "").Replace("\n", "").Replace("\t", "").Replace(" ", "").Replace(" ", "").Replace(" ", ""); MatchCollection matchsdata = matches(data, "\"[\\s\\S]*?\""); string[,] temps = new string[matchsdata.Count / 2, 2]; int count0 = 0; int count1 = 0; string input = string.Empty; foreach (Match m in matchsdata) { string tempdata = m.Value.Replace("\"", ""); try { int tryp = int.Parse(tempdata); temps[count1, 1] = tempdata; count1++; } catch (Exception ex) { temps[count0, 0] = tempdata; count0++; } } for (int i = 0; i < (matchsdata.Count / 2); i++) { input += "insert into tbl_CityCode(c_city,c_code) values('" + temps[i, 0] + "','" + temps[i, 1] + "')\r\n"; } textBox2.Text = input; } public static MatchCollection matches(string str, string exp) { return Regex.Matches(str, exp, RegexOptions.IgnoreCase); }
首先是將輸入的數據處理,去除換行符,空格什麼的。然後你應該是會得到一行數據,然後通過正則表達式匹配出所有帶引號的數據,你會發現需要的數據全部都是用引號引起來的,但是怎樣區分城市名和城市代碼呢,它們是混在一起的。不用擔心,你發現了嗎?城市名是字符串,城市代碼是一串數字,我們只要將匹配出的數據數組遍歷,每一行數據都去轉換成int類型,這樣城市名的行就會報錯,在catch中捕捉,這一行就是城市名,沒錯的就是城市代碼,把數據一次存到一個二維數組,對應的列中就行了。這樣就會獲得了相對應的城市名和城市代碼。生成的sql語句要對應相應的數據庫表。
表結構:
轉換完了將生成的sql語句放到查詢器中執行就ok了。共處理了349個城市。
最後不放心自己的算法,隨機抽查了幾條數據,沒有錯誤。