V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  wxf666  ›  全部回复第 24 页 / 共 27 页
回复总数  523
1 ... 16  17  18  19  20  21  22  23  24  25 ... 27  
2022-07-28 10:47:50 +08:00
回复了 hahaFck 创建的主题 程序员 Java 关于数据库 Entity 如何设计
怎么感觉有的在说数据库的设计,有的在说 API 的设计……
@lmshl 懂的,都用递归下降了,肯定可以支持递归文法嘛

上条回复我是说,你当前代码里,没有用到递归文法,所以应该是三型文法

仅从『是否匹配』角度说,是可用『正则表达式』描述 你的文法 的(每个文法的结果处理函数就算了)
@lmshl 瞅了瞅,没用过 scala ,只能大概看得懂

这是扩展了自带正则库的文法规则,其递归下降去匹配?

int 、bool 、double 、string 是词法分析,其余是语法分析?(感觉全说成是语法分析也无不可?)

全部是三型文法?(因为没有递归?如:options ::= "options" ":" (options_tuple ("," options_tuple)* | options))

也是高度依赖 tuple 有明确不同于其他文法的规则(要是 {options: opt1: val1, opt2: val2, label: user_id} 就完蛋了)


估计上游不好好用 json 库,自己手动拼接去了,真的是搞事情
2022-07-26 08:03:13 +08:00
回复了 kerrspace 创建的主题 程序员 如何确保移动硬盘的大量数据不会损坏?
@wizardyhnr 能用 100% 冗余度 代替原文件吗?否则出现所有备份各损坏一部分,咋办
2022-07-26 06:42:34 +08:00
回复了 kerrspace 创建的主题 程序员 如何确保移动硬盘的大量数据不会损坏?
@kerrspace 根据 @wizardyhnr #3 所说,利用 par2 (类似 winrar 冗余校错)写个小脚本,来实现:

(对于 A 盘任意文件 D:/path/src_file ,应对应于 a 盘中的 E:/path/src_file.par2 冗余校检文件)

1. src_file.par2 不存在,则自动生成( 50% 冗余度?允许 < 50% 错误?)

2. src_file.par2 上次访问 /修改时间已超过 30 天,则校检一次(并自动修复错误),并更新访问 /修改时间

3. src_file 不存在,则删除 src_file.par2

效果会好吗?
2022-07-26 06:26:05 +08:00
回复了 kerrspace 创建的主题 程序员 如何确保移动硬盘的大量数据不会损坏?
@kerrspace 假如一个压缩包内容是 ABC ,A 盘内容变成 BBC ,a 盘内容变成 ABB ,咋办?
@FYFX 我这方面没啥经验。但总感觉,你的『解析 options 的值』这个步骤,适合放到语法分析中


如你所说,『在碰到下个<keyword, 关键字>或者<}, 右花括号>之前……』,

即『在碰到两种 Token 之前……』?


另外,放到语法分析中,后续若想解析成 下列形式,也更容易些?(可扩展性强些?)

1. {"options": {"1": "a:aa", "2": "b:bb"}}

2. {"options": ["1:a:aa", "2:b:bb"]}


好吧,如果放到词法分析中,要打算用啥方法解析 Token 呢?

NFA/DFA ?应该不够用吧(也就是,三型文法的正则表达式,无法胜任了)

LL/LR/SLR/LALR ?(我瞅瞅去)
@FYFX 词法分析有上下文相关的吗?
@lmshl
@ericmzhu
@ysc3839
@FYFX

编译原理新手求问,你们咋写词法和语法分析呢?


比如下面这条,你们词法分析结果是啥呢?

{options:1:yes:tag-info,2:no:tag-danger}


这样吗?

<{,左括号><options,关键字><:,冒号><1,数字><:,冒号><yes,字符串>……<},右括号>


那你们文法咋写呢?

1. 键值对 ::= 关键字 ":" 『???』

2. 多个键值对 ::= 键值对 | 键值对 "," 多个键值对

3. 对象 ::= "{" 多个键值对 "}"
@sutra 我看 regex101 说,golang 的正则不支持断言,条件子组也不支持。你这是用了第三方库是嘛

每匹配一个字前,都要看看后面的是否是一个关键字,我总觉得性能消耗会大一点

另外,我老怀疑你『?!:』写错了……
@morri 你试试这个:

\s*"?(options)"?\s*:\s*"?((?:[^,]*?:[^,]*?:[^,]*?,?)*)"?\s*([,}])|\s*"?(\w+)"?\s*:\s*"?(.*?)"?\s*([,}])

『要求』

1. options 键的值,为若干个以『,』分隔的 value:label:class (每个字段都不包含『,』)

2. 其他键的值不包含『,』『}』

3. 头尾裹上『"』后(若已有则不裹)仍符合 json 字符串规范
@morri 那你要给出各字段值的特点才行啊

否则产生的歧义,怕是连人工都分不清:

{options:1:yes:tag-info,2:no:tag-danger,label:用户 id,searchType:1,hide:1,disabled:1,required:1}

也可以认为是:

{"options": "1:yes:tag-info,2:no:tag-danger,label:用户 id,searchType:1,hide:1,disabled:1,required:1"}
@ranxi 描述改个不停。。不如放几行数据出来

我还是觉得 sqlite 足够你用,几行的事

下载个 sqlite3.exe ( 1~2MB )就能用,也不用管理员权限,内存占用也随你设,1MB ,1GB ,都行

xml 也很好解决,xmlstarlet
@morri 临时学了下 golang ,看起来运行没问题

『源码』

package main

import (
  "fmt"
  "regexp"
)

func main() {
   str := `{
    "label" : {label} ,
     searchType : "hide_222" ,
    "hide" : 333 disabled ,
     disabled : "required" ,
    "required" : "options" ,
     options:1:yes:tag-info,2:no:tag-danger
  }`
   re := regexp.MustCompile(`\s*"?(options)"?\s*:\s*"?(.*?)"?\s*(})|\s*"?(\w+)"?\s*:\s*"?(.*?)"?\s*(,)`)
   fmt.Println(re.ReplaceAllString(str, `"$1$4":"$2$5"$3$6`))
}


『输出』

{"label":"{label}","searchType":"hide_222","hide":"333 disabled","disabled":"required","required":"options","options":"1:yes:tag-info,2:no:tag-danger"}
#1 说这是 golang ?在 regex101 看了下,支持的正则特性有点少。。

反正不要求通用方案,那就随便写咯


『模式匹配』

\s*"?(options)"?\s*:\s*"?(.*?)"?\s*(})|\s*"?(\w+)"?\s*:\s*"?(.*?)"?\s*(,)


『全部替换为』

\"$1$4\":\"$2$5\"$3$6


『要求』

1. 除了 options 外,其他键的值不包含『,』(锚定键值对结束)

2. options 键在最后一位,其值不包含『}』(锚定键值对结束)

3. 头尾裹上『"』后(若已有则不裹)仍符合 json 字符串规范

 (如:『 key: 他说"xxx",我不以为然』变成『"key": "他说"xxx",我不以为然"』会出问题)


『例子』

原文:

{
  "label" : 用户 id ,
   searchType : "1" ,
  "hide" : 1 ,
   disabled : "1" ,
  "required" : "1" ,
   options:1:yes:tag-info,2:no:tag-danger
}

替换后:

{"label":"用户 id","searchType":"1","hide":"1","disabled":"1","required":"1","options":"1:yes:tag-info,2:no:tag-danger"}
2022-07-24 03:03:40 +08:00
回复了 975779964 创建的主题 问与答 有没有 读取 json 文件根据 js 表达式 显示结果的工具
噢,还有个操作二

$ jq '[.data[] | select(.age | tonumber > 1)][0]' test.json

{
 "name": "name2",
 "age": "2"
}
2022-07-24 02:59:14 +08:00
回复了 975779964 创建的主题 问与答 有没有 读取 json 文件根据 js 表达式 显示结果的工具
用过 jq ,语法是有点绕,功能还算凑合。好像是没有交互,自然也没有补全


$ jq '.data[].name' test.json

"name1"
"name2"
"name3"


$ jq -r '[.data[].name]' test.json

[
 "name1",
 "name2",
 "name3"
]
@krixaar 不知为何不考虑数据库,权限不足?不熟悉?

连 1MB 、无需额外进程 的 SQLite 也要排除。。

那上面提到的大数据平台就更离谱了


眼拙,丝毫没看出原来是在讽刺

其他做得好的类似软件,是如何存储这些小文件的?数据库?

SQLite 确实提到过,数据库中存储小文件,可比文件系统快 35%,减少 20% 磁盘占用

https://sqlite.org/fasterthanfs.html
@krixaar 这个开销有点大噢

比如 Linux ext4 ,每个文件所需的一个 inode 要 256 字节(存各种属主、权限、时间信息,还有数据分布在哪儿等),

且不说应该不会预留几亿个 inode 可用,光是建一亿个文件就要 23.8 GB 的 inode ,还没算目录……

以及长文件名、特殊符号等其他问题

那还不如用数据库呢,MySQL 的 innodb 下,一行数据仅额外需要至少 18 字节(存事务、回滚信息等),SQLite 更少

若这个表的 B+树 3~4 层高,前两层容易缓存至内存,那么翻译一行数据一般只需额外读取 1~2 次硬盘,绝对比文件系统开销小
@ranxi 可以试试用 sqlite ,几行搞定 导入+翻译+输出,感觉速度应该也不慢


1. 生成 O2.txt (从小写字母,映射至大写字母,共 26 行)

printf "%s\n" {a..z} | sed 's/^.*$/&\t\U&/' | tee O2.txt

『输出』
a    A
b    B
…  …
z    Z


2. 生成 O1.txt (也是 26 行,字段内容是:主键 ID 、预期转换成啥样、待转换内容)

printf "%s\n" {a..z} | awk -v OFS=$'\t' '{print NR, toupper($0), $0}' | tee O1.txt

『输出』
1    A    a
2    B    b
…  …  …
26    Z    z


3. 导入映射表至数据库

sqlite3 -tabs O2.db 'CREATE TABLE O2 (key PRIMARY KEY, value) WITHOUT ROWID' '.import O2.txt O2'


4. 逐行查数据库进行翻译

4.1 为 SQLite 启用 csv 扩展

①下载 csv.c: https://www.sqlite.org/src/file?name=ext/misc/csv.c&ci=tip
②编译扩展:参考 https://sqlite.org/loadext.html

4.2 翻译

SQLITE_CSV_LIB_PATH='./csv' # 编译好的 CSV 模块库路径(可省略后缀)
SQLITE_CACHE_SIZE_MB=512 # 数据库最大缓存页面大小(单位:MB )

# sed -E 's/"/""/g; s/^|$/"/g; s/\t/","/g' O1.txt |
tr '\t' ',' < O1.txt | # 制表符 转成 逗号(要求 O1.txt 每列内容,都不包含『"』『,』,否则用上面那行)

sqlite3 -tabs O2.db \
  ".load $SQLITE_CSV_LIB_PATH" \
  "PRAGMA cache_size = -$((SQLITE_CACHE_SIZE_MB << 10))" \
  'CREATE VIRTUAL TABLE TEMP.O1 USING csv(filename="/dev/stdin", columns=3)' \
  'SELECT O1.c0 id, O1.c1 expect, O2.value replaced FROM O1 LEFT JOIN O2 ON O1.c2 = O2.key'

『输出』
id   expect   replaced
1    A    A
2    B    B
…  …  …
26    Z    Z
1 ... 16  17  18  19  20  21  22  23  24  25 ... 27  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5695 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 29ms · UTC 05:51 · PVG 13:51 · LAX 22:51 · JFK 01:51
Developed with CodeLauncher
♥ Do have faith in what you're doing.