Txt Reader

Ön Hazırlık

HATIRLATMA: Eğer project,module,package sistemleri ile ilgili ön bilginiz varsa ve bu konulara aşinaysanız bu admımı geçebilirsiniz!

Öncelikle yeni bir proje oluşturalım.

mkdir textreader_project
# go mod init projeLokasyonu/projeAdı
go mod init myawesomeproject/textreader

Şimdi cd komutu yardımıyla projenin içine girelim ve burada file.txt isimli bir text dosyası oluşturalım.

cd textreader_project/
touch file.txt

oluşturduğumuz txt dosyası içerisine rastgele bir metin kopyalayalım. Ben kendi projemde büyük Türk Edebiyatçısı Ahmet Kabaklı'ya ait bir metin kopyaladım.

"İşte arkadaşlar, bir memleketin yabancı harslar, yabancı dinler, yabancı kültürler, yabancı filmler, yabancı türküler, yabancı şarkılar, yabancı danslar tarafından kuşatılmasına "Kültür emperyalizmi" denir. Bu en öldürücü emperyalizmdir.

Ahmet Kabaklı

Ön hazırlıklarımız tamamlandıktan sonra projemize ait kodları yazmaya başlayalım.Text dosyalarının go ile okunması için farklı yöntemler mevcuttur. Öncelikle ilk yöntemi inceleyelim :

bufio ve os kütüphanelerini kullanarak Text Dosyası Okuma

bufio ve os isimli standart kütüphaneleri kullanarak okuma işlemini gerçekleştiriyoruz. Ayrıca log kütüphanesi aracılığıyla sistem loglarından hata mesajı döndüreceğiz.

Bu kütüphanelere ait kaynaklar :

Standart kütüphaneleri inceledikten sonra şimdi kodumuzu inceleyelim:


import (
	"bufio"
	"fmt"
	"log"
	"os"
)

func ReadTextFile(filename string) {

	file, err := os.Open(filename) // Dosyayı aç ve file isimli bir değişkene ata
	defer file.Close()             // dosyayı işlem bittiğinde kapat ve hafızayı boşalt

  // dosyayı açamazsan hata döndür
	if err != nil {
		log.Fatal(err)
	}

	reader := bufio.NewReader(file)

	for {
		line, _, err := reader.ReadLine()

		if len(line) > 0 {
			fmt.Printf("Readline: %q \n", line)
		}
		if err != nil {
			break
		}
	}

func main(){
    // longhand writing
    // var filename string = "file.txt"

    filename := "file.txt"
    ReadTextFile(filename)
  }
}

Kodumuzu parçalara ayırarak incelemeye başlıyoruz. İlk olarak Dosyanın açılması ve okunması aşamasıyla başlıyoruz.

func ReadTextFile(filename string) {

  file, err := os.Open(filename) // Dosyayı aç ve file isimli bir değişkene ata
	defer file.Close()             // dosyayı işlem bittiğinde kapat ve hafızayı boşalt

  // dosyayı açamazsan hata döndür
	if err != nil {
		log.Fatal(err)
	}

// diğer kodlar

}

os.Open() fonksiyonu []byte cinsinden bir dosya ve err hata döndürür. Eğer dosya okuma başarılı olursa file isimli değişkene verileri []byte cinsinden atar. Eğer başarısız olursa bu sefer de err isimli bir hata mesajı döndürür.Bu aşamada hata yakalamk için if err =! nil {} boilerplate kodunu kullanıyoruz. Bu yapı genel geçer hata yakalama yapısıdır. Bunun haricinde de hata yakalama yapıları mevcuttur fakat internette en sık karşılaşacağınız yapı bu yapıdır.


func (){

// önceki kodlar

	reader := bufio.NewReader(file) // byte olarak okunan file değişkenini string ifadesine çevir


	for {
		line, _, err := reader.ReadLine()

		if len(line) > 0 {
			fmt.Printf("Readline: %q \n", line)
		}
		if err != nil {
			break
		}

}

Kodun bu kısmında reader isimli bir değişken oluşturuyoruz ve bu değişkene []byte cinsinde mevcut olan file isimli verimizi argüman olarak veriyoruz. bufio.NewReader() isimli fonksiyon []byte cinsinden gelen değeri insan tarafından okunabilir (human-readable) bir forma dönüştürür. reader isimli değişken bir yığın olarak mevcut olduğundan dolayı satır satır okuma işlemi gerçekleştirmek için bir for{} döngüsü yazıyoruz. reader.Readline() isimli fonksiyonumuz (line []byte, isPrefix bool, err error) olmak üzere 3 adet değer döndürür. isPrefix değeri işlemimizde bize gerekmediği için onun yerine _ ifadesi kullanıyoruz. Okunursa satır değeri, okunamazsa hata değeri döndürür.


		if len(line) > 0 {
			fmt.Printf("Readline: %q \n", line)
		}

Bu satırda ise eğer satır ifadesinin uzunluğu 0 'dan büyükse ekrana yazdırma işlemi gerçekleştir diyoruz. Yani satırda herhangi bir değer varsa bu değerin içerdiği satırı yazdır komutu veriyoruz.


		if err != nil {
			break
		}

Eğer sistemde bir hata ile karşılaşırsan döngüyü kır ve işlemi sonlandır komutunu da bu şekilde yazıyoruz. Şimdi de konu çalıştırmadan önceki son işleme gelelim :


func main(){
    // longhand writing
    // var filename string = "file.txt"
    filename := "file.txt"
    ReadTextFile(filename)
  }
}

Burada dosyamıza ait veri girişini yapıyoruz. filename := "file.txt" ile dosyamızın adını belirtip bunu oluşturduğumuz ReadTextFile(filename) fonksiyonumuza argüman olarak veriyoruz. Ekran çıktımız aşağıdaki şekilde olacaktır.

Readline: "\"İşte arkadaşlar, bir memleketin yabancı harslar, yabancı dinler, yabancı kültürler, yabancı filml
er, yabancı türküler, yabancı şarkılar, yabancı danslar tarafından kuşatılmasına \"Kültür emperyalizmi\" denir
. Bu en öldürücü emperyalizmdir."
Readline: "Ahmet Kabaklı"

os.ReadFile komutu ile ekrana yazdırma


func TXTReader(filename string){

file, err := os.ReadFile(filename)
	defer fmt.Println("Dosya Kapatıldı")

	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("Dosya açıldı ve işlem görüyor")
	strData := string(file)
	fmt.Print(strData)
}