1. 程式人生 > >使用golang讀取StarDict 詞典idx檔案並按行輸出

使用golang讀取StarDict 詞典idx檔案並按行輸出

StarDict 詞典idx檔案格式:

每一個條目在單詞列表中包含陸續三個域:

word_str;                 // a utf-8 string terminated by '\0'.

                                  // 一個 utf-8 編碼字串,以 '\0' 終止符結束。word_str 的長度將是小於 256 的

word_data_offset; // word data's offset in .dict file

                                  // 單詞資料在 .dict 檔案中的偏移,

                                  //If the version is "3.0.0" and "idxoffsetbits=64", 

                                  //word_data_offset will be 64-bits unsigned number in network byte order. 

word_data_size;   // word data's total size in .dict file

                                  // 單詞資料在 .dict 檔案中的總大小,word_data_size should be 32-bits unsigned number

                                  // in network byte order.

package main


import (
//    "bufio"
    "io"
    "os"
    "fmt"
     "strconv"
)
func main() {
    fi, err := os.Open("gaojihanyudacidian_fix.idx")/*現代漢語詞典\\*/
    if err != nil { panic(err) }
    defer fi.Close()

    fo, err := os.Create("output.txt")
    if err != nil { panic(err) }
    defer fo.Close()
	/*每次只讀4個位元組*/
    read_buf := make([]byte,4)
    jiange := make([]byte,1)
    huanghuang := make([]byte,1)
    jiange[0]=9
     huanghuang[0]=10   
    var pos,nextPos uint64 = 0,0

    /*標記當下需要讀取的是哪個域的資料
    為1是word_str  
    為2是word_data_offset  
    為3是word_data_size*/ 
    var setp int = 1  
    /*記錄已經儲存在word_str中的字元個數(不包括字串最後的\0),也就是說下次從word_str[lenth_of_word_str]處開始存*/
    var lenth_of_word_str,charNum int = 0,0
    word_str := make([]byte,257)
    var tmpChar byte =0
    var word_data_offset uint64 = 0  
    var word_data_size uint64 = 0    
    count :=1
    for{
    	pos=nextPos
	count++
        n,err := fi.ReadAt(read_buf,(int64)(pos))
        if err != nil && err != io.EOF{
            panic(err)
        }
        /*檔案格式要求:讀取資料小於4個位元組時說明檔案結束*/
        if   n < 4{
            fmt.Printf("\nfinish read\n")
            break
        }
	switch setp {
	case 1:
//		fmt.Println("1:")
		tmpChar=read_buf[0]
		/*如果第一個字元是‘\0’說明該步驟已經結束*/
		if  tmpChar !=  0{
		
			/*因為可能有逗號,所以可能只有1個或者倆個位元組組成一個字元*/
			if tmpChar < 128{
				charNum=1/*charNum記錄utf8編碼的字元數*/
			}else if tmpChar < 194{
				panic(err)
			}else if tmpChar < 224{
				charNum=2
			}else if tmpChar < 240{
				charNum=3
			}else{
				panic(err)
			}
			
			
			read_buf[charNum]=0
			str1 := (string)(read_buf[0:charNum+1])
			copy(word_str[lenth_of_word_str:lenth_of_word_str+charNum], read_buf[:charNum])
			lenth_of_word_str=lenth_of_word_str+charNum
			nextPos=nextPos+(uint64)(charNum)
			continue
		}else{
			word_str[lenth_of_word_str]=9
			nextPos=nextPos+1
			
		}		
		
        	
	case 2:

		word_data_offset  =0
		word_data_offset  = word_data_offset+((uint64)(read_buf[0]))*16*16*16*16*16*16
		word_data_offset  = word_data_offset+((uint64)(read_buf[1]))*16*16*16*16
		word_data_offset  = word_data_offset+((uint64)(read_buf[2]))*16*16
		word_data_offset  = word_data_offset+(uint64)(read_buf[3])
		nextPos=nextPos+4
		
//        	fmt.Printf("word_data_offset  =%d   \n",word_data_offset/*(uint64)(read_buf[3])*/)
	case 3:

		word_data_size  =0
		word_data_size  = word_data_size+(uint64)(read_buf[0])*16*16*16*16*16*16
		word_data_size  = word_data_size+(uint64)(read_buf[1])*16*16*16*16
		word_data_size  = word_data_size+(uint64)(read_buf[2])*16*16
		word_data_size  = word_data_size+(uint64)(read_buf[3])
		nextPos=nextPos+4

	default:

        }
        /*現在可以寫入了*/

	if setp == 3{
	
		if _,err := fo.Write( word_str[:lenth_of_word_str+1]); err != nil{
		    panic(err)
		}
		
	        word_data_offset_str := strconv.FormatUint(word_data_offset,10)  
	        word_data_size_str := strconv.FormatUint(word_data_size,10)   		
		if _,err := fo.WriteString(  word_data_offset_str); err != nil{
		    panic(err)
		}
 		
		if _,err := fo.Write( jiange[0:1]); err != nil{
		    panic(err)
		}		
		if _,err := fo.WriteString( word_data_size_str); err != nil{
		    panic(err)
		}		
		if _,err := fo.Write( huanghuang[0:1]); err != nil{
		    panic(err)
		}
		lenth_of_word_str=0
	}
        setp=setp+1
        if setp > 4{
		setp = 1   
	}
    }
}







相關推薦

使用golang讀取StarDict 詞典idx檔案輸出

StarDict 詞典idx檔案格式: 每一個條目在單詞列表中包含陸續三個域: word_str;                 // a utf-8 string terminated by '\0'.                             

python_csv_逐讀取csv檔案存入列表

# -*- coding=utf-8 -*- import csv #載入csv包便於讀取csv檔案 csv_file=open('D:/scores.csv') #開啟csv檔案 csv_reader_lines = csv.reader(csv_file)

Java文字檔案讀取

package my; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.InputStrea

PHP讀取檔案保持原樣輸出

  $file_path = $folder.$file_name; $handle = fopen($file_path, "r");//讀取二進位制檔案時,需要將第二個引數設定成'rb' //通過filesize獲得檔案大小,將整個

go 讀取資料夾所有檔案生成md5 字串

為檔案生成MD5字串 func CreateMd5(filename string, md5str *string) { f, err := os.Open(filename) if err != nil { fmt.Println("Open", err)

python讀取點雲txt檔案顯示

  #-*-coding:utf-8-*- import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D def readXYZfile(filename,

shell實現讀取兩個檔案拼接成一行

場景:     檔案A內容如下:         a         b         c         d         e     檔案B內容如下:         1         2  

unity 檔案更改自動生成.bytes檔案 與 點選play自動讀取指定路徑excel檔案生成.bytes檔案

using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using Sys

新生成txt檔案寫入內容 python

f = open("Label.txt",'a')//讀取label.txt檔案,沒有則建立,‘a’表示再次寫入時不覆蓋之前的內容 f.write(strcontent) f.write('\n')//

python查詢指定資料夾下所有檔案修改時間倒序排列

程式碼如下: import os, glob, time def search_all_files_return_by_time_reversed(path, reverse=True):

使用JDBC讀取本地的Excel檔案批量更新資料

package com.jqgj.test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; impo

使用nodejs讀取簡體語言json檔案生成繁體語言json檔案

有時需要為專案準備不同語言的檔案供使用者選擇,簡體和繁體算是常見的需求了。 比如我們有如下的簡體中文檔案: { "hello":"你好", "業務":"業務" } value值為我們最終要顯示在瀏覽器中的內容。 接下來可以寫我們的

PHP Excel 讀取xls,xlsx檔案出入資料然後儲存

客戶有個需求就是在給定的excle檔案中插入相關資料,一定要注意excle裡的一些格式會匯出phpexcle讀取後無法儲存,折騰了許久,把excel檔案比較特殊的格式去掉就能正常讀取,插入資料,儲存了,下面給大家示例我的程式碼 require_once 'PHPExcel.

Python3 隨機生成一組不重複數寫入檔案

筆主在做一個專案要生成一組隨機有序的整型數字,並按行輸出到文字檔案使用,恰好開始學習Python3,遂決定直接使用Python3解決 思路:與隨機數相關的函式都要使用到random這個系統庫,檢視相關

Java實現讀取Excel條件輸出TXT

據我所知,java中能操作Excel檔案的jar包有兩個 Apache公司的一個API 微軟的java Excel包 在這裡我使用的是第二個,微軟公司的java Excel包 這個包出現了一個為題,並不能順利的輸出規定的xls 會報錯 在測試多次無

java利用WatchService實時監控某個目錄下的文件變化解析(註:附源代碼)

tomcat啟動 interrupt extend red -name 利用 end eba tor 首先說下需求:通過ftp上傳約定格式的文件到服務器指定目錄下,應用程序能實時監控該目錄下文件變化,如果上傳的文件格式符合要求,將將按照每一行讀取解析再寫入到數據庫,解析完之

Linux查看文件總的數據數,拆分

big 數據行 查看 進行 class 利用 post 大小 linux 先利用 wc -l BLM.txt 讀出 BLM.txt 文件一共有多少行。 再 1. 以行數拆分 -l 參數: split –l 50 原始文件 拆分後文件名

比較三個數大小輸出

從鍵盤輸入任意三個數,比較其大小,找出最大值,並將這三個數按從大到小的順序輸出程式碼設計如下:#include<stdio.h>int main(){ int a,b,c,t; printf("請輸入三個整數:\n"); scanf_s("%d\t%d\t%d",

Python輸出檔案內容詳解及延伸

#! /usr/bin/python2.7 try:                                                                                                              //try....except----

專案日誌輸入出不同的檔案級別輸出

一,需要用到的jar,新增maven依賴 <!-- log --> <dependency> <groupId>org.slf4j</groupId>