Soran
Optik Değerlendirme Programı Yardımı

Genel Tartışma
-
iyi günler
1 - yukarıda ki gibi bir optik değerlendirme programı yapmak istiyorum fakat resimdeki gibi bir .txt dosyasını datagridlere nasıl aktaracam. yanı ismi sınıfı cevapları ayırma işlemini
2- orada bulunan cevapları nasıl karşılaştırma yapabilirim
yardımcı olursanız çok sevinirim şimdiden teşekkürler
- Değiştirilmiş Tür Kyamuran SalibryamMicrosoft contingent staff, Moderator 17 Ekim 2016 Pazartesi 11:50
Tüm Yanıtlar
-
File ve Text kütüphanesini kullanarak. Text dosyası "fixed delimited" denilen türde. Text dosya olarak açıp okuyacaksınız, uzunluklardan parçalayıp bir veri saklama ortamına atacaksınız. (veritabanı olabilir, xml olabilir vb.) daha sonra da cevapları harf harf alıp değerlendireceksiniz.
http://pgnchess.com
http://dergikapaklari.com- Düzenleyen Halil TAŞ 12 Ekim 2016 Çarşamba 08:49
-
Merhaba,
Merak ettiğim için soruyorum, 5-6-7 kolonlarındaki değerler neyi temsil ediyor ?
Ayrıca, ben şöyle birşey yapmıştım sana örnek olması için paylaşayım istersen.
Bir Class yarattım ve kolonların isimlerini yazdım.
class brillFormat { public string receteKodu { get; set; } public string receteAdi { get; set; } public DateTime receteTarihi { get; set; } public string hammaddeKodu { get; set; } public string hammaddeAdi { get; set; } public int tartimNoktasiId { get; set; } public decimal alinacakMiktar { get; set; }
sonra format dosyası yaptım.
class tb_brillDosyaFormati { public int satirReceteKodu { get; set; } public int satirReceteAdi { get; set; } public int satirTarih { get; set; } public int satirReceteSatirlari { get; set; } public string bitisParametresi { get; set; } public int kolonHammaddeKoduBaslangic { get; set; } public int kolonHammaddeKoduBitis { get; set; } public int kolonHammaddeAdiBaslangic { get; set; } public int kolonHammaddeAdiBitis { get; set; } public int kolonMiktarBaslangic { get; set; } public int kolonMiktarBitis { get; set; } public int birdenCokSiloParametresi { get; set; } public int ilkTartimNoktasinaYuzde { get; set; } public tb_brillDosyaFormati select() { Harmanlama.Source.db.veriTabani vt = new db.veriTabani(); DataTable dt = vt.returnDataTable("select * from tb_brillDosyaFormati"); tb_brillDosyaFormati bdf = new tb_brillDosyaFormati(); bdf.satirReceteKodu = (int)dt.Rows[0]["satirReceteKodu"]; bdf.satirReceteAdi = (int)dt.Rows[0]["satirReceteAdi"]; bdf.satirTarih = (int)dt.Rows[0]["satirTarih"]; bdf.satirReceteSatirlari = (int)dt.Rows[0]["satirReceteSatirlari"]; bdf.bitisParametresi = dt.Rows[0]["bitisParametresi"].ToString().Trim(); bdf.kolonHammaddeKoduBaslangic = (int)dt.Rows[0]["kolonHammaddeKoduBaslangic"]; bdf.kolonHammaddeKoduBitis = (int)dt.Rows[0]["kolonHammaddeKoduBitis"]; bdf.kolonHammaddeAdiBaslangic = (int)dt.Rows[0]["kolonHammaddeAdiBaslangic"]; bdf.kolonHammaddeAdiBitis = (int)dt.Rows[0]["kolonHammaddeAdiBitis"]; bdf.kolonMiktarBaslangic = (int)dt.Rows[0]["kolonMiktarBaslangic"]; bdf.kolonMiktarBitis = (int)dt.Rows[0]["kolonMiktarBitis"]; bdf.birdenCokSiloParametresi = (int)dt.Rows[0]["birdenCokSiloParametresi"]; bdf.ilkTartimNoktasinaYuzde = (int)dt.Rows[0]["ilkTartimNoktasinaYuzde"]; return bdf; }
sonra dosyadan açıp satır satır okudum
public List<brillFormat> dosyadanOku(string dosyaYolu) { StreamReader objReader = new StreamReader(dosyaYolu); string sLine = ""; ArrayList arrText = new ArrayList(); while (sLine != null) { sLine = objReader.ReadLine(); if (sLine != null) arrText.Add(sLine); } return dosyadanOkunaniFormatlandir(arrText); }
sonra da satırları sutunlara çevirdim. Bursa senin 5-6-7 kolonlarındaki değerleri dönüştürmen gerek galiba.
private List<brillFormat> dosyadanOkunaniFormatlandir(ArrayList satirSatirListe) { List<brillFormat> bList = new List<brillFormat>(); Harmanlama.Source.Tables.tb_brillDosyaFormati d = new Tables.tb_brillDosyaFormati(); d = d.select(); if (satirSatirListe.Count == 0) return null for (int i = 0; satirSatirListe.Count > i; i++) { if (satirSatirListe[i].ToString() != d.bitisParametresi) { brillFormat b = new brillFormat(); if (i == d.satirReceteKodu) //Reçete kodu b.receteKodu = satirSatirListe[i].ToString(); if (i == d.satirReceteAdi) //reçete Adı b.receteAdi = satirSatirListe[i].ToString(); if (i == d.satirTarih) //Tarih b.receteTarihi = Convert.ToDateTime(satirSatirListe[i]); if (i > d.satirReceteSatirlari) //satırlar { b.hammaddeKodu = satirSatirListe[i].ToString().Substring(d.kolonHammaddeKoduBaslangic, d.kolonHammaddeKoduBitis).Trim(); b.tartimNoktasiId = Convert.ToInt32(dt.Rows[0][0].ToString()); b.alinacakMiktar = Convert.ToDecimal(satirSatirListe[i].ToString().Substring(d.kolonMiktarBaslangic, d.kolonMiktarBitis)); bList.Add(b); } } return bList; }
sonra en güzel yer..
private void btnBrillDosyaOku_Click(object sender, EventArgs e) { openFileDialog1.Title = "Open"; openFileDialog1.Filter = "(*.txt)|*.txt"; openFileDialog1.FileName = null; openFileDialog1.ShowDialog(); Harmanlama.Source.import.brillFormat bf = new Source.import.brillFormat(); List<Harmanlama.Source.import.brillFormat> bfList = new List<Source.import.brillFormat>(); if (openFileDialog1.FileName != "") { bfList = bf.dosyadanOku(openFileDialog1.FileName); DataGridView1.DataSoruce = bfList; } }
Yani özetle,
Dosyayı seçtik, satır satır okuduk, sonra satırları substring ile önceden girilen değerlere göre sütunlara dönüştürdük. Ben Datagrid kullanmamıştım ama senin için o kısmı değiştirdim.
İnşallah işine yarar. Yada anlamadığın yer varsa sorabilirsin.
-
-
-
Bu son derece basit bir format ve 'Fixed Width Data' ya da 'System Data Format - SDF' olarak biliniyor. Resim yerine bir satirini verseydin daha iyiydi ya neyse, kendi uydurdugum 2 ornek satirla giris kismi soyle olabilir:
(Ornek Satirlar)
AHMET DENEME 1234 8A B ABCDABCDABCDABCDABCDABCDABCDAB ABCDABCDABCDABCDABCDABCDABCDAB ABCDABCDABCDABCDABCDABCDABCDAB MEHMET DENEME 1234 8A B AAABB CC DD BAB AA BACD ACCA ABCCABABACBBABBBAA ABBBBA BBCA AABCBAA
Simdi bu satirlarin uzerine gecici olarak bir 'cetvel' koyup, alan genisliklerini aliyoruz:
1 2 3 4 5 6 7 8 9 0 1 2 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 AHMET DENEME 1234 8A B ABCDABCDABCDABCDABCDABCDABCDAB ABCDABCDABCDABCDABCDABCDABCDAB ABCDABCDABCDABCDABCDABCDABCDAB MEHMET DENEME 1234 8A B AAABB CC DD BAB AA BACD ACCA ABCCABABACBBABBBAA ABBBBA BBCA AABCBAA
Genislikleri hesaplarsak 18,4,3,2,31,31,31 - son ucunden once bir bosluk var onun icin onlari 1+30 diye dusunuyoruz.
"Sadece ornek olsun diye" soyle bir yapiya okuyabiliriz:
void Main() { var cevapDosyasi = @"c:\Dizin\sinav.txt"; var cevapAnahtari1 = "DDAADACBCADACBBADBBACBABDDBDAD"; var cevapAnahtari2 = "BCCBDAADDBBBBDAAADBBBBCDDBDDAA"; var cevapAnahtari3 = "CCACCABABAADCADBAAADCCCDBAACBC"; var ornek = DosyaOku(cevapDosyasi,cevapAnahtari1, cevapAnahtari2, cevapAnahtari3); } public IEnumerable<Data> DosyaOku(string fileName, string anahtar1, string anahtar2, string anahtar3) { return from l in File.ReadAllLines(fileName) where l.Trim().Length >= 27 && char.IsLetter(l[0]) let c = l.PadRight(120) let t1 = c.Substring(28, 30) let t2 = c.Substring(59, 30) let t3 = c.Substring(90, 30) let s1 = TestSonuc(anahtar1, t1) let s2 = TestSonuc(anahtar2, t2) let s3 = TestSonuc(anahtar3, t3) select new Data { SoyadAd = c.Substring(0, 18).Trim(), OgrNo = c.Substring(18, 4).Trim(), GrupNo = c.Substring(22, 3).Trim(), Kit = c.Substring(25, 2).Trim(), Test1 = t1, Test2 = t2, Test3 = t3, Test1Sonuc = s1, Test2Sonuc = s2, Test3Sonuc = s3 }; } public Sonuc TestSonuc(string cevapAnahtari, string cevaplar) { var sonuc = new Sonuc { SoruSayisi = cevapAnahtari.Length }; for (int i = 0; i < cevapAnahtari.Length; i++) { if (i >= cevaplar.Length || cevaplar[i] == 32) sonuc.Bos++; else if (cevaplar[i] == cevapAnahtari[i]) sonuc.Dogru++; else sonuc.Yanlis++; } return sonuc; } public struct Data { public string SoyadAd { get; set; } public string OgrNo { get; set; } public string GrupNo { get; set; } public string Kit { get; set; } public string Test1 { get; set; } public string Test2 { get; set; } public string Test3 { get; set; } public Sonuc Test1Sonuc { get; set; } public Sonuc Test2Sonuc { get; set; } public Sonuc Test3Sonuc { get; set; } } public struct Sonuc { public int SoruSayisi { get; set; } public int Bos { get; set; } public int Dogru { get; set; } public int Yanlis { get; set; } }
Bu kodu LinqPad'de deneyip sonuna:
ornek.Dump();
dersek, aldigimiz cikti:
-
-
-
-
Kod zaten C#, LinqPad'de sadece yukaridaki combodan C# program secmen lazim (Ctrl+3).
Ne hatasi veriyor? Neden hatayi soylemiyorsun?
- Düzenleyen CetinBasozEditor 13 Ekim 2016 Perşembe 10:00