আমি স্ট্রিং ভেরিয়েবলের মধ্যে পুরো ফাইলটি কীভাবে পড়তে পারি


161

আমার কাছে প্রচুর ছোট ফাইল রয়েছে, আমি সেগুলি লাইন লাইন পড়তে চাই না।

গো-তে কোনও ফাংশন রয়েছে যা পুরো ফাইলটি স্ট্রিং ভেরিয়েবলের মধ্যে পড়বে?

উত্তর:


253

ব্যবহার ioutil.ReadFile:

func ReadFile(filename string) ([]byte, error)

ReadFile ফাইলের নাম অনুসারে ফাইলটি পড়ে এবং সামগ্রীগুলি ফেরত দেয় returns একটি সফল কল ত্রুটিযুক্ত == শূন্য নয়, ত্রুটিযুক্ত নয় == ইওএফ। রিডফাইলে পুরো ফাইলটি পড়ার কারণে এটি পড়ার কোনও ইওএফকে প্রতিবেদন করা ত্রুটি হিসাবে বিবেচনা করে না।

আপনি একটি এর []byteপরিবর্তে পাবেন string। এটি সত্যই প্রয়োজনে রূপান্তর করা যেতে পারে :

s := string(buf)

5
তারপরে চূড়ান্ত স্ট্রিং ফলাফল গঠনের জন্য, আপনি প্রতিটি ফাইল পড়ার সাথে সাথে একক বাইট স্লাইসে ডেটা সংগ্রহ করতে অ্যাপেন্ড () ব্যবহার করতে পারেন, তারপরে সঞ্চিত বাইট স্লাইসকে চূড়ান্ত স্ট্রিংয়ের ফলাফলে রূপান্তর করতে পারেন। বিকল্পভাবে আপনি বাইট পছন্দ করতে পারেন।
সোনিয়া

1
এটি কীভাবে রূপান্তর করা যায় তা আমাদের দেখান ... প্রশ্নটি কোনও বাইট অ্যারের জন্য জিজ্ঞাসা করে না।
কাইল ব্রিজেনস্টাইন

এইচটিএমএল ফাইল খোলার জন্য এটি ব্যবহার করে এবং আমি দেখতে পাই যে প্রতিটি লাইনের পরে একটি নতুন লাইন সংযুক্ত করা হয়েছে যা আমাদের কিছু ফর্ম্যাটিংয়ে গোলমাল করছে। তা এড়ানোর কোনও উপায় আছে কি?
জোনাথন

55

যদি আপনি কেবল সামগ্রীটি চান stringতবে সহজ সমাধানটি হ'ল প্যাকেজ ReadFileথেকে ফাংশনটি ব্যবহার করা io/ioutil। এই ফাংশনটি এমন একটি স্লাইস দেয় bytesযা আপনি সহজেই এ রূপান্তর করতে পারেন string

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    b, err := ioutil.ReadFile("file.txt") // just pass the file name
    if err != nil {
        fmt.Print(err)
    }

    fmt.Println(b) // print the content as 'bytes'

    str := string(b) // convert content to a 'string'

    fmt.Println(str) // print the content as a 'string'
}

22

আমি মনে করি যে করণীয় সেরা, যদি আপনি এই সমস্ত ফাইলের সাথে যুক্ত হওয়ার দক্ষতা সম্পর্কে সত্যই উদ্বিগ্ন হন তবে সেগুলি একই বাইট বাফারে অনুলিপি করা।

buf := bytes.NewBuffer(nil)
for _, filename := range filenames {
  f, _ := os.Open(filename) // Error handling elided for brevity.
  io.Copy(buf, f)           // Error handling elided for brevity.
  f.Close()
}
s := string(buf.Bytes())

এটি প্রতিটি ফাইল খোলে, এর বিষয়বস্তুগুলিকে বুফে অনুলিপি করে তারপরে ফাইলটি বন্ধ করে দেয়। আপনার পরিস্থিতির উপর নির্ভর করে আপনার এটিকে রূপান্তর করার দরকার নেই, শেষ লাইনটি কেবল এটি দেখানোর জন্য যে buf.Bytes () এর কাছে আপনার সন্ধান করা ডেটা রয়েছে।


হাই, কপি কি বুফের সামগ্রী ওভাররাইট করবে? আর বুফের ক্ষমতা কী? ধন্যবাদ।
WoooHaaaa

অনুলিপি ওভাররাইট হবে না, এটি কেবল বুফে যুক্ত করা অবিরত রাখবে, এবং নতুন ডেটা সংযোজন করার জন্য বুফ তত বাড়বে।
ওয়াইল্ড চালানো

1
বুফের একটি "অসীম" ক্ষমতা রয়েছে। আরও ডেটা যুক্ত হওয়ার সাথে সাথে এটি প্রসারিত হতে থাকবে। ioutil.Readfile এমন একটি বাফার বরাদ্দ করবে যা সম্পূর্ণ ফাইলের পক্ষে ফিট করার জন্য যথেষ্ট বড় এবং পুনর্বিবেচনার প্রয়োজন হয় না।
স্টিফেন ওয়েইনবার্গ

1
বাইটবফার ব্যবহার করে কেবল স্লাইসে (/ অ্যারে) যুক্ত করার তুলনায় কার্যকারিতাটি কী উন্নত হয়? স্মৃতি কি? পার্থক্য কত বড়?
কিসাকি

8

এটি আমি এটি করেছিলাম:

package main

import (
  "fmt"
  "os"
  "bytes"
  "log"
)

func main() {
   filerc, err := os.Open("filename")
   if err != nil{
     log.Fatal(err)
   }
   defer filerc.Close()

   buf := new(bytes.Buffer)
   buf.ReadFrom(filerc)
   contents := buf.String()

   fmt.Print(contents) 

}    

-2

আমি কম্পিউটারের সাথে নেই, তাই আমি একটি খসড়া লিখি। আমি যা বলি তা আপনি পরিষ্কার করতে পারেন।

func main(){
    const dir = "/etc/"
    filesInfo, e := ioutil.ReadDir(dir)
    var fileNames = make([]string, 0, 10)
    for i,v:=range filesInfo{
        if !v.IsDir() {
            fileNames = append(fileNames, v.Name())
        }
    }

    var fileNumber = len(fileNames)
    var contents = make([]string, fileNumber, 10)
    wg := sync.WaitGroup{}
    wg.Add(fileNumber)

    for i,_:=range content {
        go func(i int){
            defer wg.Done()
            buf,e := ioutil.Readfile(fmt.Printf("%s/%s", dir, fileName[i]))
            defer file.Close()  
            content[i] = string(buf)
        }(i)   
    }
    wg.Wait()
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.