使用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>