Java'da Dosya Okuma İşlemleri Hakkında Yardım

Bu konuyu okuyanlar

sakarya2929

Öğrenci
Katılım
4 Mart 2017
Mesajlar
4
Reaksiyon puanı
1
Puanları
3
Arkadaşlar projem var bazı kısımlarında takıldım java'da txt dosyasından okuduğumuz metinleri ekrana yazdırma ancak belli kurallar dahilinde BNF denen bir format var aşağıdaki şekildeki gibi txt dosyasının içinde bulunan bu bnf formatını alıp içinde bulunan köşeli parantezler içindekileri yok sayarak sadece sayıları alt alta sıralama yaparak kaç adet veri ekrana yazdırdığımızı da göstermemiz isteniyor.


BNF.txt dosyasının içinde
[sayı] ::=[rakam] | [sayı] [rakam]

[rakam] ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

bu yazıları alıp sadece sayılar kısmını alarak ekrana alt alta yazdırmak aslında bizden istenen bir dönüştürücü ekran çıktısı örneğin

Toplam Terminal:10
Terminaller:
0
1
2
3
4
5
6
7
8
9

bu bnf.txt dosyasının içeriği onun formatına göre farklı bir yazıda olabilir sadece kural köşeli parantezleri ve ::= gibi ifadeleri yok etmek onları nonterminal saymak örneğin txt dosyası içine
[A] ::= [A]B | C | [D]
[D] ::= C[D] | C

yazsak ekran çıktısı olarak bize javada
Toplam Terminal Sayısı: 2
Terminaller:
B
C

olarak vermesi gerekli bu proje ödevini yapın demiyorum yanlış anlaşılmasın sadece daha önce java görmedim ben c#biliyorum çok ileri düzey olmasada benim yaptığım çalışmada bir Arraylist oluşturup txt dosyasındaki verileri içine atıp onların içinde replace komutuyla bazı karakterleri atmak ve arraylisti ekrana yazdırmak oldu ama yukarıda verilen 2. örnekte bu yazdığım kodlar pek işe yaramadı sanırım regex.Pattern komutlarını kullanacağız ama yani yardımcı olabilecek bir arkadaş ufak örnek kod dizini ile bi fikir verebilirmi en azından nasıl ilerleyeceğimi görmek adına.
 

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
BNF'de çok farklı yazım şekli var hepsini aynı anda halledebilecek tek bir yöntem yok.
İnternete bnf java parser veya bnf parser yazın örnekleri inceleyin.
 

Ben Kenobi

Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,336
Reaksiyon puanı
3,155
Puanları
113
Kod:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.swing.JOptionPane;

public class BNF
{
   public static void main(String[] args)
   {
       String fileName = "BNF.txt";
       String result = "";

       try
       {
           InputStreamReader fileInput = new InputStreamReader(new FileInputStream(fileName), "UTF-8");
           int r;
           char c;
           while((r = fileInput.read()) != -1)
           {
               c = (char) r;
               if(Character.isDigit(c))
                   result += c + "\n";
           }
           fileInput.close();

           JOptionPane.showMessageDialog(null, result, "Success", JOptionPane.INFORMATION_MESSAGE);
       }
       catch(IOException exception)
       {
           JOptionPane.showMessageDialog(null, "Not found the file : " + fileName, "Fail", JOptionPane.ERROR_MESSAGE);
       }
   }
}
 

errno

Doçent
Katılım
17 Temmuz 2016
Mesajlar
694
Reaksiyon puanı
567
Puanları
93
Merhaba,

herhangi bir formatın önemi yok. Sonuç itibariyle bir text dosyası okuyacaksınız ve sadece istediğiniz elemanları seçeceksiniz. Java konusunda uzman değilim, java kodlama işlerim farklı yönlerde ancak bu engel değil sanıyorum.

Aşağıda sizin isteğinize yakın kodlar var gibi geliyor bana :)
Ekleme ve kodlardan bazı satırları çıkarma yapmak zorundasınız biraz. Örnek olarak bir değişken tanımlayın , her istediğinizi bulduğunda bir artsın.
Aynı değeri ekranda toplamdan sonra yazdırın ve yazdırırkende alt satıra geçiş yaptırın.


public static void main(String[] args) {

Scanner scan = null;
File f = new File(filename);
try {
scan = new Scanner(f);
} catch (FileNotFoundException e) {
System.out.println("File not found.");
System.exit(0);
}

int total = 0;
boolean foundInts = false; //flag to see if there are any integers

while (scan.hasNextLine()) { //Note change
String currentLine = scan.nextLine();
//split into words
String words[] = currentLine.split(" ");

//For each word in the line
for(String str : words) {
try {
int num = Integer.parseInt(str);
total += num;
foundInts = true;
System.out.println("Found: " + num);
}catch(NumberFormatException nfe) { }; //word is not an integer, do nothing
}
} //end while

if(!foundInts)
System.out.println("No numbers found.");
else
System.out.println("Total: " + total);

// close the scanner
scan.close();
}

Kaynak : Reading only the integers from a txt file and adding the value up for each found

Sizin için ayrıca kodlama yapmak isterdim ancak bunu siz yaparsanız daha iyi kavrayacağınızı düşünüyorum.

Not : @Ben Kenobi arkadaşımız yazmış bile.

Saygılarımla
 

Ben Kenobi

Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,336
Reaksiyon puanı
3,155
Puanları
113
Benim yazdığımda düzeltimesi gereken bir yer var.
Hangi platformda olursa olsun stringleri döngü içerisinde toplayarak oluşturmak yavaş bir yöntem.
Çünkü string toplama işlemi tek satırlık bir işlem olarak tasarlanmıştır, döngüde kullanmak, aynı string'in gereksiz yere defalarca kopyalanmasına ve yavaşlamaya yol açar.
Bunun yerine Java'da StringList gibi bir class olması lazım, onunla yaparsanız daha hızlı çalışır, o kısmı size bıraktım.
 

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
İkinizin yazdığı kodun da sorulan soruyla alakası yok ki, dikkatli inceleyin soruyu, arkadaş başka bir şey soruyor.
 

errno

Doçent
Katılım
17 Temmuz 2016
Mesajlar
694
Reaksiyon puanı
567
Puanları
93
Merhaba,

@mirinkirin haklı olabilirsin ancak ben yol göstermek adına yazdım. Yani bir dosyaya giriş/çıkış işlemi, okuma ve seçme işlemine uyuyor yazdığım kodlar. Kodların birebir tutması gerekmiyor diye düşünüyorum, yani en azından soran arkadaşımızın aklında bir fikir oluşsun adına yazdım diyebilirim. Zaten yazımda da belirttim. Ama uyarın için teşekkür ederim tekrar bakacağım.

Saygılarımla
 

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
@errno sizin ve kenobinin yazdığı kodlar arkadaşın verdiği ilk örneği sağlıyor. Sonraki verdiği örnek sanırım dikkatinizden kaçmış, dosya içerisinde
[A] ::= [A]B | C | [D]
[D] ::= C[D] | C
gibi bir ifade olduğunda bize C ve B'yi vermesini istemiş. Aynı zamanda ilk örnekteki ifade olduğunda da sayıları vermesini istemiş.
Yani ortada düz bir metinden sadece sayıları veya sadece harfleri çekmek problemi yok, bnf formatı özel bir format bu formata göre yazılan her şeyi çekme problemi var. Büyük ihtimalle proje ödevi falan zaten.
 

Ben Kenobi

Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,336
Reaksiyon puanı
3,155
Puanları
113
Backus–Naur form - Wikipedia

Buradan anladığıma göre BNF geniş bir format.
Kendi parserınızı yazmak gerekir.
Deterministik durum otomatları oluşturmak vs derken graflara kadar yolu var.

Regex ile halledilebilir ama performansı çok düşük olur ve kodu okumak çok zor olur.
 

sakarya2929

Öğrenci
Katılım
4 Mart 2017
Mesajlar
4
Reaksiyon puanı
1
Puanları
3
Yorumlarınız ve uğraşlarınız için çok teşekkürler arkadaşlar bende söylediğiniz gibi normal bir java dosya okuma işlemi yaptım ama @mirinkirin arkadaşımızın dediği gibi sadece ilk programda etkili @Ben Kenobi sizin söylediğiniz gibi regex ile nasıl halledilebilir çokça ingilizce ve türkçe kaynak inceledim ancak bir sonuca varamadım eğer önerebileceğiniz bi kaynak kod varsa çok müteşekkir olurum.
 

Ben Kenobi

Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,336
Reaksiyon puanı
3,155
Puanları
113
Regex bilgim fazla yok.
Regex bence son çare yapın.
Öncelikle elinize bir kalem kağıt alın.
Durumları yazın.
Hangi duruma nasıl giriyor ve nasıl çıkıyor, onları yazın.
Hangi durumlarda ne yapmanız lazım, onları yazın.
Kodlaması zor değil ama bu gibi şeylerin tasarlaması zor.
 

sakarya2929

Öğrenci
Katılım
4 Mart 2017
Mesajlar
4
Reaksiyon puanı
1
Puanları
3
Evet haklısınız tasarlaması biraz karmaşık sıkıntı olanda o zaten yapacağımız kodla [köşeli parantez içinde yer alan bilgileri] almayacak ve | veya çizgileri arasında yer alan köşeli parantezsiz ifadeleri | yakalamak ve onları yazdırmak aslında ufak bir algoritma yaptım ama söylediğim gibi c# kodlarıyla çalıştım java ilk defa uğraşıyorum kod kısmında biraz eksiklerim var süre kısıtlı olduğundan danışmak istedim yinede yardımlarınız için teşekkürler..
 

turangcmn

Öğrenci
Katılım
18 Mart 2017
Mesajlar
1
Reaksiyon puanı
0
Puanları
1
Yaş
26
C diskinde "kayitlar.ser" dosyası oluşturulacak ve bu dosyaya 1 den 100 e kadar sayıları alt alta yazan program..? yardımcı olursanız
 
Üst