Procházet zdrojové kódy

docs(v5): cleanup old scripts and temporary CSV artifacts

Remove deprecated extract_full_report.py / v4 / old backup + all CSV output files from batch mode.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
asus před 2 měsíci
rodič
revize
7aa3d71d51

+ 0 - 225
docs/参考资料/CSV/501999942-某人-个体化食物推荐表.csv

@@ -1,225 +0,0 @@
-名称,分类,推荐指数,能量KJ,蛋白g,脂肪g,碳水化合物g,淀粉g,总膳食纤维g,胆固醇mg
-大麦,主食,17,1481,12,2,73,0,17,0
-小米,主食,5,1582,11,4,72,0,8,0
-小麦,主食,10,1423,10,1,75,0,12,0
-小麦面包,主食,-14,1116,10,3,48,36,4,0
-意大利面,主食,-4,386,1,3,13,0,2,0
-燕麦,主食,35,297,17,6,66,0,1,0
-玉米粒,主食,38,298,1,0,14,14,0,0
-米饭,主食,-12,1527,7,0,79,0,1,0
-玉米饼,主食,7,912,5,2,44,0,6,0
-荞麦面粉,主食,0,1402,12,3,70,0,10,0
-葡萄干浆即食谷物,主食,0,1354,7,1,78,0,13,0
-面条,主食,-10,1609,14,4,71,0,3,84
-鸡蛋面包,主食,-11,1201,9,6,47,0,2,51
-黑麦面包,主食,-6,1188,9,3,53,0,6,0
-冰淇淋,乳制品,-11,690,1,3,32,0,0,8
-奶油,乳制品,-20,515,3,10,4,0,0,35
-奶酪,乳制品,-8,1552,23,29,2,0,0,94
-牛奶,乳制品,9,268,3,3,4,0,0,14
-脱脂牛奶,乳制品,15,142,3,0,4,0,0,2
-黄油,乳制品,-48,2999,0,81,0,0,0,215
-山核桃,干果,-15,2889,9,71,13,0,9,0
-山核桃干,干果,-5,2749,12,64,18,0,6,0
-杏仁,干果,-3,2423,21,49,21,0,12,0
-开心果,干果,-13,2392,21,45,28,1,10,0
-松子,干果,-17,2816,13,68,13,1,3,0
-栗子,干果,37,1519,6,1,79,0,0,0
-核桃,干果,-10,2738,15,65,13,0,6,0
-椰肉,干果,0,1481,3,33,15,0,9,0
-榛子,干果,40,2629,14,60,16,0,9,0
-橡子,干果,36,1619,6,23,40,0,0,0
-腰果,干果,-9,2402,15,46,32,0,3,0
-芝麻酱,干果,3,2454,18,50,24,0,5,0
-莲子,干果,53,372,4,0,17,0,0,0
-葵花子,干果,-1,2445,20,51,20,0,8,0
-银杏坚果,干果,-8,1456,10,2,72,0,0,0
-比萨,快餐,-12,1121,10,12,29,18,2,14
-热狗,快餐,-17,1167,9,3,50,36,1,0
-鸡米花,快餐,-20,1469,17,21,21,18,1,40
-三文鱼,水产品,16,594,19,6,0,0,0,55
-凤尾鱼,水产品,15,548,20,4,0,0,0,60
-墨鱼,水产品,8,331,16,0,0,0,0,112
-大比目鱼,水产品,15,382,18,1,0,0,0,49
-大西洋鳕鱼,水产品,0,343,17,0,0,0,0,43
-小龙虾,水产品,13,322,15,0,0,0,0,114
-扇贝,水产品,0,289,12,0,3,2,0,24
-条纹鲈鱼,水产品,18,406,17,2,0,0,0,80
-海鲈鱼,水产品,5,332,15,1,0,0,0,52
-牡蛎,水产品,14,339,9,2,4,0,0,50
-白鲑,水产品,10,611,17,8,0,0,0,65
-石斑鱼,水产品,23,385,19,1,0,0,0,37
-章鱼,水产品,11,343,14,1,2,0,0,48
-虾,水产品,-2,297,13,1,0,0,0,126
-蛤蜊,水产品,0,360,14,0,3,1,0,30
-蟹,水产品,13,364,18,1,0,0,0,78
-贻贝,水产品,4,360,11,2,3,0,0,28
-金枪鱼,水产品,15,602,23,4,0,0,0,38
-鱼子酱,水产品,-19,1105,24,17,4,0,0,588
-鱿鱼,水产品,9,385,15,1,3,0,0,233
-鲈鱼,水产品,16,381,19,0,0,0,0,90
-鲍鱼,水产品,5,439,17,0,6,0,0,85
-鲟鱼,水产品,12,439,16,4,0,0,0,60
-鲤鱼,水产品,11,531,17,5,0,0,0,66
-鲭鱼,水产品,4,858,18,13,0,0,0,70
-鲱鱼,水产品,2,661,17,9,0,0,0,60
-鲶鱼,水产品,17,519,20,4,0,0,0,59
-鲷鱼,水产品,17,418,20,1,0,0,0,37
-鲽鱼,水产品,3,294,12,1,0,0,0,45
-鳕鱼,水产品,16,364,18,0,0,0,0,41
-鳗鱼,水产品,5,770,18,11,0,0,0,126
-鳟鱼,水产品,11,619,20,6,0,0,0,58
-沙丁鱼,水产品,19,347,0,1,19,0,5,0
-黄尾,水产品,17,611,23,5,0,0,0,55
-龙虾,水产品,3,324,16,0,0,0,0,127
-无花果,水果,15,310,0,0,19,0,2,0
-李子,水果,13,192,0,0,11,0,1,0
-杏,水果,2,201,1,0,11,0,2,0
-杨桃,水果,57,128,1,0,6,0,2,0
-枣,水果,-6,1176,4,0,72,0,6,0
-柠檬,水果,58,121,1,0,9,0,2,0
-柿子,水果,16,293,0,0,18,0,3,0
-桃,水果,3,165,0,0,9,0,1,0
-桑葚,水果,50,180,1,0,9,0,1,0
-梨,水果,55,239,0,0,15,0,3,0
-榴莲,水果,43,615,1,5,27,0,3,0
-樱桃,水果,20,1395,1,0,80,0,2,0
-哈密瓜,水果,6,141,0,0,8,0,0,0
-橘子,水果,1,197,0,0,11,0,2,0
-橙汁,水果,47,188,0,0,10,0,0,0
-橙皮,水果,38,405,1,0,25,0,10,0
-橙菠萝汁,水果,14,214,0,0,12,0,0,0
-油桃,水果,3,185,1,0,10,0,1,0
-猕猴桃,水果,32,255,1,0,14,0,3,0
-甜瓜,水果,-4,150,0,0,9,0,0,0
-番木瓜,水果,32,179,0,0,10,0,1,0
-石榴,水果,46,346,1,1,18,0,4,0
-红苹果,水果,13,247,0,0,14,0,2,0
-芒果,水果,-11,250,0,0,14,0,1,0
-苹果,水果,14,218,0,0,13,0,2,0
-苹果汁,水果,-19,191,0,0,11,0,0,0
-草莓,水果,37,136,0,0,7,0,2,0
-荔枝,水果,25,276,0,0,16,0,1,0
-菠萝,水果,1,209,0,0,13,0,1,0
-菠萝蜜,水果,14,397,1,0,23,1,1,0
-葡萄,水果,40,280,0,0,17,0,0,0
-葡萄干,水果,-38,264,1,0,15,0,0,0
-葡萄柚,水果,54,134,0,0,8,0,1,0
-蓝莓,水果,40,240,0,0,14,0,2,0
-蔓越莓,水果,33,191,0,0,11,0,3,0
-西瓜,水果,19,127,0,0,7,0,0,0
-覆盆子,水果,42,220,1,0,11,0,6,0
-面包果酱,水果,15,431,1,0,27,0,4,0
-香蕉,水果,10,371,1,0,22,5,2,0
-鳄梨,水果,37,670,2,14,8,0,6,0
-黑莓,水果,61,181,1,0,9,0,5,0
-龙眼,水果,55,251,1,0,15,0,1,0
-番茄汤,汤,8,165,0,0,9,0,0,0
-土豆蔬菜汤,汤,-5,126,1,1,3,0,0,1
-素食蔬菜汤,汤,-5,119,0,0,4,0,0,0
-火腿,肉类,-11,683,16,8,3,0,1,57
-火鸡,肉类,4,790,28,7,0,0,0,109
-烟熏火腿,肉类,-14,591,18,2,10,0,0,50
-烤肉,肉类,-11,1512,20,30,0,0,0,105
-烤鸭,肉类,-6,1410,18,28,0,0,0,84
-烧鹅,肉类,0,1276,25,21,0,0,0,91
-牛肉汤,肉类,-2,25,1,0,0,0,0,0
-牛肉瘦,肉类,7,488,23,2,0,0,0,55
-牛肉肥,肉类,-29,2845,10,70,0,0,0,95
-牛蛙,肉类,12,305,16,0,0,0,0,50
-猪培根,肉类,-28,1744,12,39,1,0,0,66
-猪头肉,肉类,-18,658,13,10,0,0,0,69
-猪瘦肉,肉类,11,562,21,4,0,0,0,64
-猪耳朵,肉类,1,695,15,10,0,0,0,90
-猪肝,肉类,14,690,26,4,3,0,0,355
-猪脑,肉类,-21,577,12,9,0,0,0,2552
-猪蹄,肉类,1,889,23,12,0,0,0,88
-瘦羊肉,肉类,12,862,28,9,0,0,0,92
-肉丸,肉类,-25,1196,14,22,8,2,2,66
-肥猪肉,肉类,-34,2449,10,60,0,0,0,81
-肥羊肉,肉类,-32,2782,6,70,0,0,0,90
-鸡心,肉类,9,640,15,9,0,0,0,136
-鸡汤,肉类,-8,26,0,0,0,0,0,2
-鸡肉,肉类,-2,604,28,3,0,0,0,86
-鸡肝,肉类,2,496,16,4,0,0,0,345
-鹅肝,肉类,9,556,16,4,6,0,0,515
-鹌鹑,肉类,8,803,19,12,0,0,0,76
-南瓜,蔬菜,66,109,1,0,6,0,0,0
-卷心菜,蔬菜,51,103,1,0,5,0,2,0
-四季豆,蔬菜,68,131,1,0,6,0,2,0
-土豆,蔬菜,57,322,2,0,17,15,2,0
-土豆面粉,蔬菜,48,1493,6,0,83,0,5,0
-大白菜,蔬菜,75,55,1,0,2,0,1,0
-大蒜,蔬菜,47,623,6,0,33,0,2,0
-大豆,蔬菜,72,614,12,6,11,0,4,0
-小南瓜,蔬菜,0,69,1,0,3,0,1,0
-小萝卜,蔬菜,74,76,0,0,4,0,1,0
-山药,蔬菜,56,343,1,0,20,0,0,0
-扁豆,豆类及豆制品,55,1473,24,1,63,49,10,0
-木薯,蔬菜,36,667,1,0,38,0,1,0
-洋葱,蔬菜,45,166,1,0,9,0,1,0
-炒蘑菇,蔬菜,24,110,3,0,4,0,1,0
-炒香菇,蔬菜,17,162,3,0,7,0,3,0
-牛蒡根,蔬菜,78,302,1,0,17,0,3,0
-甘薯,蔬菜,35,359,1,0,20,12,3,0
-甜椒,蔬菜,65,84,0,0,4,0,1,0
-甜玉米,蔬菜,42,360,3,1,18,5,2,0
-甜菜,蔬菜,67,180,1,0,9,0,2,0
-甜菜叶,蔬菜,68,92,2,0,4,0,3,0
-生姜,蔬菜,86,75,0,0,3,0,1,0
-生菜,蔬菜,68,62,1,0,2,0,1,0
-番茄汁,蔬菜,0,72,0,0,3,0,0,0
-白菜,蔬菜,59,48,1,0,1,0,1,0
-白萝卜,蔬菜,81,59,1,0,2,0,1,0
-白蘑菇,蔬菜,63,93,3,0,3,0,1,0
-秋葵,蔬菜,62,138,1,0,7,0,3,0
-竹笋,蔬菜,81,115,2,0,5,0,2,0
-红心萝卜,蔬菜,76,132,1,0,7,0,3,0
-红豆,蔬菜,38,121,4,0,4,0,0,0
-绿豆,蔬菜,35,126,3,0,5,0,1,0
-羽衣甘蓝,蔬菜,80,207,4,0,8,0,3,0
-胡萝卜,蔬菜,33,173,0,0,9,1,2,0
-芋头,蔬菜,62,469,1,0,26,0,4,0
-芝麻,蔬菜,57,2397,17,49,23,0,11,0
-芥末,蔬菜,83,114,2,0,4,0,3,0
-芦笋,蔬菜,71,85,2,0,3,0,2,0
-花椒,蔬菜,77,80,0,0,4,0,1,0
-花椰菜,蔬菜,63,104,1,0,4,0,2,0
-芹菜,蔬菜,60,67,0,0,2,0,1,0
-苦瓜,蔬菜,72,126,5,0,3,0,0,0
-茄子,蔬菜,59,104,0,0,5,0,3,0
-苋菜叶,蔬菜,50,97,2,0,4,0,0,0
-菊苣,蔬菜,83,71,0,0,4,0,3,0
-菜豆,蔬菜,70,280,6,0,13,0,0,0
-菠菜,蔬菜,68,97,2,0,3,0,2,0
-蕨类,蔬菜,80,143,4,0,5,0,0,0
-藜,蔬菜,83,180,4,0,7,0,4,0
-蘑菇,蔬菜,64,141,2,0,6,0,2,0
-西兰花,蔬菜,74,141,2,0,6,0,2,0
-西红柿,蔬菜,74,74,0,0,3,0,1,0
-豆芽,蔬菜,69,510,13,6,9,0,1,0
-豇豆,蔬菜,73,376,2,0,18,0,5,0
-豌豆,豆类及豆制品,72,1435,21,1,62,0,15,0
-辣椒,蔬菜,35,88,0,0,5,0,1,0
-韭菜,蔬菜,47,126,3,0,4,0,2,0
-香菇,蔬菜,63,160,1,0,6,0,3,0
-黄瓜,蔬菜,61,65,0,0,3,0,0,0
-水煮蛋,蛋类,-13,597,12,9,0,0,0,370
-炒蛋,蛋类,-22,621,9,10,1,0,0,277
-煎蛋,蛋类,-24,643,10,11,0,0,0,313
-鸡蛋,蛋类,-12,599,12,9,0,0,0,372
-鸡蛋白,蛋类,10,216,10,0,0,0,0,0
-鸡蛋黄,蛋类,-26,1346,15,26,3,0,0,1085
-鹌鹑蛋,蛋类,-14,663,13,11,0,0,0,844
-利马豆,豆类及豆制品,21,1414,21,0,63,0,19,0
-大豆面粉,豆类及豆制品,11,1816,37,20,31,0,9,0
-嫩豆腐,豆类及豆制品,18,253,7,3,1,0,0,0
-纳豆,豆类及豆制品,16,883,19,11,12,0,5,0
-羽扇豆,豆类及豆制品,26,1554,36,9,40,0,18,0
-老豆腐,豆类及豆制品,19,326,9,4,2,0,0,0
-花生,豆类及豆制品,4,2374,25,49,16,0,8,0
-花生酱,豆类及豆制品,-14,2464,24,49,21,4,8,0
-蚕豆,豆类及豆制品,25,1425,26,1,58,0,25,0
-豆浆,豆类及豆制品,19,226,3,1,6,0,0,0
-鹰嘴豆,豆类及豆制品,12,1581,20,6,62,0,12,0
-黄豆,豆类及豆制品,27,1443,22,2,60,0,25,0

+ 0 - 225
docs/参考资料/CSV/530010234-侯-个体化食物推荐表.csv

@@ -1,225 +0,0 @@
-名称,分类,推荐指数,能量KJ,蛋白g,脂肪g,碳水化合物g,淀粉g,总膳食纤维g,胆固醇mg
-大麦,主食,10,1481,12,2,73,0,17,0
-小米,主食,5,1582,11,4,72,0,8,0
-小麦,主食,3,1423,10,1,75,0,12,0
-小麦面包,主食,-7,1116,10,3,48,36,4,0
-意大利面,主食,0,386,1,3,13,0,2,0
-燕麦,主食,31,297,17,6,66,0,1,0
-玉米粒,主食,39,298,1,0,14,14,0,0
-米饭,主食,-1,1527,7,0,79,0,1,0
-玉米饼,主食,4,912,5,2,44,0,6,0
-荞麦面粉,主食,1,1402,12,3,70,0,10,0
-葡萄干浆即食谷物,主食,0,1354,7,1,78,0,13,0
-面条,主食,-1,1609,14,4,71,0,3,84
-鸡蛋面包,主食,-1,1201,9,6,47,0,2,51
-黑麦面包,主食,1,1188,9,3,53,0,6,0
-冰淇淋,乳制品,-4,690,1,3,32,0,0,8
-奶油,乳制品,-5,515,3,10,4,0,0,35
-奶酪,乳制品,-1,1552,23,29,2,0,0,94
-牛奶,乳制品,3,268,3,3,4,0,0,14
-脱脂牛奶,乳制品,6,142,3,0,4,0,0,2
-黄油,乳制品,-20,2999,0,81,0,0,0,215
-山核桃,干果,-7,2889,9,71,13,0,9,0
-山核桃干,干果,-3,2749,12,64,18,0,6,0
-杏仁,干果,-2,2423,21,49,21,0,12,0
-开心果,干果,-6,2392,21,45,28,1,10,0
-松子,干果,-7,2816,13,68,13,1,3,0
-栗子,干果,50,1519,6,1,79,0,0,0
-核桃,干果,-5,2738,15,65,13,0,6,0
-椰肉,干果,0,1481,3,33,15,0,9,0
-榛子,干果,45,2629,14,60,16,0,9,0
-橡子,干果,44,1619,6,23,40,0,0,0
-腰果,干果,-3,2402,15,46,32,0,3,0
-芝麻酱,干果,1,2454,18,50,24,0,5,0
-莲子,干果,45,372,4,0,17,0,0,0
-葵花子,干果,-1,2445,20,51,20,0,8,0
-银杏坚果,干果,0,1456,10,2,72,0,0,0
-比萨,快餐,-4,1121,10,12,29,18,2,14
-热狗,快餐,-5,1167,9,3,50,36,1,0
-鸡米花,快餐,-7,1469,17,21,21,18,1,40
-三文鱼,水产品,6,594,19,6,0,0,0,55
-凤尾鱼,水产品,6,548,20,4,0,0,0,60
-墨鱼,水产品,6,331,16,0,0,0,0,112
-大比目鱼,水产品,7,382,18,1,0,0,0,49
-大西洋鳕鱼,水产品,0,343,17,0,0,0,0,43
-小龙虾,水产品,7,322,15,0,0,0,0,114
-扇贝,水产品,2,289,12,0,3,2,0,24
-条纹鲈鱼,水产品,8,406,17,2,0,0,0,80
-海鲈鱼,水产品,4,332,15,1,0,0,0,52
-牡蛎,水产品,9,339,9,2,4,0,0,50
-白鲑,水产品,4,611,17,8,0,0,0,65
-石斑鱼,水产品,9,385,19,1,0,0,0,37
-章鱼,水产品,9,343,14,1,2,0,0,48
-虾,水产品,2,297,13,1,0,0,0,126
-蛤蜊,水产品,4,360,14,0,3,1,0,30
-蟹,水产品,9,364,18,1,0,0,0,78
-贻贝,水产品,5,360,11,2,3,0,0,28
-金枪鱼,水产品,7,602,23,4,0,0,0,38
-鱼子酱,水产品,-2,1105,24,17,4,0,0,588
-鱿鱼,水产品,5,385,15,1,3,0,0,233
-鲈鱼,水产品,8,381,19,0,0,0,0,90
-鲍鱼,水产品,5,439,17,0,6,0,0,85
-鲟鱼,水产品,5,439,16,4,0,0,0,60
-鲤鱼,水产品,4,531,17,5,0,0,0,66
-鲭鱼,水产品,3,858,18,13,0,0,0,70
-鲱鱼,水产品,0,661,17,9,0,0,0,60
-鲶鱼,水产品,7,519,20,4,0,0,0,59
-鲷鱼,水产品,8,418,20,1,0,0,0,37
-鲽鱼,水产品,2,294,12,1,0,0,0,45
-鳕鱼,水产品,8,364,18,0,0,0,0,41
-鳗鱼,水产品,2,770,18,11,0,0,0,126
-鳟鱼,水产品,5,619,20,6,0,0,0,58
-沙丁鱼,水产品,8,347,0,1,19,0,5,0
-黄尾,水产品,6,611,23,5,0,0,0,55
-龙虾,水产品,5,324,16,0,0,0,0,127
-无花果,水果,7,310,0,0,19,0,2,0
-李子,水果,21,192,0,0,11,0,1,0
-杏,水果,17,201,1,0,11,0,2,0
-杨桃,水果,41,128,1,0,6,0,2,0
-枣,水果,15,1176,4,0,72,0,6,0
-柠檬,水果,41,121,1,0,9,0,2,0
-柿子,水果,23,293,0,0,18,0,3,0
-桃,水果,17,165,0,0,9,0,1,0
-桑葚,水果,37,180,1,0,9,0,1,0
-梨,水果,39,239,0,0,15,0,3,0
-榴莲,水果,39,615,1,5,27,0,3,0
-樱桃,水果,24,1395,1,0,80,0,2,0
-哈密瓜,水果,19,141,0,0,8,0,0,0
-橘子,水果,17,197,0,0,11,0,2,0
-橙汁,水果,37,188,0,0,10,0,0,0
-橙皮,水果,21,405,1,0,25,0,10,0
-橙菠萝汁,水果,5,214,0,0,12,0,0,0
-油桃,水果,16,185,1,0,10,0,1,0
-猕猴桃,水果,31,255,1,0,14,0,3,0
-甜瓜,水果,5,150,0,0,9,0,0,0
-番木瓜,水果,31,179,0,0,10,0,1,0
-石榴,水果,36,346,1,1,18,0,4,0
-红苹果,水果,21,247,0,0,14,0,2,0
-芒果,水果,6,250,0,0,14,0,1,0
-苹果,水果,21,218,0,0,13,0,2,0
-苹果汁,水果,-12,191,0,0,11,0,0,0
-草莓,水果,34,136,0,0,7,0,2,0
-荔枝,水果,16,276,0,0,16,0,1,0
-菠萝,水果,18,209,0,0,13,0,1,0
-菠萝蜜,水果,23,397,1,0,23,1,1,0
-葡萄,水果,34,280,0,0,17,0,0,0
-葡萄干,水果,-15,264,1,0,15,0,0,0
-葡萄柚,水果,40,134,0,0,8,0,1,0
-蓝莓,水果,41,240,0,0,14,0,2,0
-蔓越莓,水果,30,191,0,0,11,0,3,0
-西瓜,水果,23,127,0,0,7,0,0,0
-覆盆子,水果,33,220,1,0,11,0,6,0
-面包果酱,水果,7,431,1,0,27,0,4,0
-香蕉,水果,21,371,1,0,22,5,2,0
-鳄梨,水果,32,670,2,14,8,0,6,0
-黑莓,水果,53,181,1,0,9,0,5,0
-龙眼,水果,43,251,1,0,15,0,1,0
-番茄汤,汤,3,165,0,0,9,0,0,0
-土豆蔬菜汤,汤,-1,126,1,1,3,0,0,1
-素食蔬菜汤,汤,-4,119,0,0,4,0,0,0
-火腿,肉类,-2,683,16,8,3,0,1,57
-火鸡,肉类,3,790,28,7,0,0,0,109
-烟熏火腿,肉类,-4,591,18,2,10,0,0,50
-烤肉,肉类,-3,1512,20,30,0,0,0,105
-烤鸭,肉类,-3,1410,18,28,0,0,0,84
-烧鹅,肉类,-1,1276,25,21,0,0,0,91
-牛肉汤,肉类,-4,25,1,0,0,0,0,0
-牛肉瘦,肉类,1,488,23,2,0,0,0,55
-牛肉肥,肉类,-12,2845,10,70,0,0,0,95
-牛蛙,肉类,1,305,16,0,0,0,0,50
-猪培根,肉类,-12,1744,12,39,1,0,0,66
-猪头肉,肉类,-10,658,13,10,0,0,0,69
-猪瘦肉,肉类,5,562,21,4,0,0,0,64
-猪耳朵,肉类,0,695,15,10,0,0,0,90
-猪肝,肉类,9,690,26,4,3,0,0,355
-猪脑,肉类,-6,577,12,9,0,0,0,2552
-猪蹄,肉类,-5,889,23,12,0,0,0,88
-瘦羊肉,肉类,5,862,28,9,0,0,0,92
-肉丸,肉类,-12,1196,14,22,8,2,2,66
-肥猪肉,肉类,-13,2449,10,60,0,0,0,81
-肥羊肉,肉类,-13,2782,6,70,0,0,0,90
-鸡心,肉类,5,640,15,9,0,0,0,136
-鸡汤,肉类,-6,26,0,0,0,0,0,2
-鸡肉,肉类,-1,604,28,3,0,0,0,86
-鸡肝,肉类,6,496,16,4,0,0,0,345
-鹅肝,肉类,10,556,16,4,6,0,0,515
-鹌鹑,肉类,2,803,19,12,0,0,0,76
-南瓜,蔬菜,55,109,1,0,6,0,0,0
-卷心菜,蔬菜,43,103,1,0,5,0,2,0
-四季豆,蔬菜,62,131,1,0,6,0,2,0
-土豆,蔬菜,52,322,2,0,17,15,2,0
-土豆面粉,蔬菜,54,1493,6,0,83,0,5,0
-大白菜,蔬菜,61,55,1,0,2,0,1,0
-大蒜,蔬菜,42,623,6,0,33,0,2,0
-大豆,蔬菜,59,614,12,6,11,0,4,0
-小南瓜,蔬菜,0,69,1,0,3,0,1,0
-小萝卜,蔬菜,59,76,0,0,4,0,1,0
-山药,蔬菜,52,343,1,0,20,0,0,0
-扁豆,豆类及豆制品,54,1473,24,1,63,49,10,0
-木薯,蔬菜,38,667,1,0,38,0,1,0
-洋葱,蔬菜,46,166,1,0,9,0,1,0
-炒蘑菇,蔬菜,9,110,3,0,4,0,1,0
-炒香菇,蔬菜,7,162,3,0,7,0,3,0
-牛蒡根,蔬菜,68,302,1,0,17,0,3,0
-甘薯,蔬菜,43,359,1,0,20,12,3,0
-甜椒,蔬菜,55,84,0,0,4,0,1,0
-甜玉米,蔬菜,46,360,3,1,18,5,2,0
-甜菜,蔬菜,58,180,1,0,9,0,2,0
-甜菜叶,蔬菜,60,92,2,0,4,0,3,0
-生姜,蔬菜,66,75,0,0,3,0,1,0
-生菜,蔬菜,56,62,1,0,2,0,1,0
-番茄汁,蔬菜,0,72,0,0,3,0,0,0
-白菜,蔬菜,55,48,1,0,1,0,1,0
-白萝卜,蔬菜,61,59,1,0,2,0,1,0
-白蘑菇,蔬菜,53,93,3,0,3,0,1,0
-秋葵,蔬菜,54,138,1,0,7,0,3,0
-竹笋,蔬菜,61,115,2,0,5,0,2,0
-红心萝卜,蔬菜,62,132,1,0,7,0,3,0
-红豆,蔬菜,20,121,4,0,4,0,0,0
-绿豆,蔬菜,20,126,3,0,5,0,1,0
-羽衣甘蓝,蔬菜,63,207,4,0,8,0,3,0
-胡萝卜,蔬菜,41,173,0,0,9,1,2,0
-芋头,蔬菜,56,469,1,0,26,0,4,0
-芝麻,蔬菜,53,2397,17,49,23,0,11,0
-芥末,蔬菜,63,114,2,0,4,0,3,0
-芦笋,蔬菜,61,85,2,0,3,0,2,0
-花椒,蔬菜,61,80,0,0,4,0,1,0
-花椰菜,蔬菜,56,104,1,0,4,0,2,0
-芹菜,蔬菜,52,67,0,0,2,0,1,0
-苦瓜,蔬菜,53,126,5,0,3,0,0,0
-茄子,蔬菜,52,104,0,0,5,0,3,0
-苋菜叶,蔬菜,33,97,2,0,4,0,0,0
-菊苣,蔬菜,61,71,0,0,4,0,3,0
-菜豆,蔬菜,59,280,6,0,13,0,0,0
-菠菜,蔬菜,59,97,2,0,3,0,2,0
-蕨类,蔬菜,61,143,4,0,5,0,0,0
-藜,蔬菜,65,180,4,0,7,0,4,0
-蘑菇,蔬菜,54,141,2,0,6,0,2,0
-西兰花,蔬菜,60,141,2,0,6,0,2,0
-西红柿,蔬菜,63,74,0,0,3,0,1,0
-豆芽,蔬菜,57,510,13,6,9,0,1,0
-豇豆,蔬菜,60,376,2,0,18,0,5,0
-豌豆,豆类及豆制品,62,1435,21,1,62,0,15,0
-辣椒,蔬菜,48,88,0,0,5,0,1,0
-韭菜,蔬菜,38,126,3,0,4,0,2,0
-香菇,蔬菜,56,160,1,0,6,0,3,0
-黄瓜,蔬菜,52,65,0,0,3,0,0,0
-水煮蛋,蛋类,-4,597,12,9,0,0,0,370
-炒蛋,蛋类,-6,621,9,10,1,0,0,277
-煎蛋,蛋类,-7,643,10,11,0,0,0,313
-鸡蛋,蛋类,-3,599,12,9,0,0,0,372
-鸡蛋白,蛋类,4,216,10,0,0,0,0,0
-鸡蛋黄,蛋类,-8,1346,15,26,3,0,0,1085
-鹌鹑蛋,蛋类,-3,663,13,11,0,0,0,844
-利马豆,豆类及豆制品,13,1414,21,0,63,0,19,0
-大豆面粉,豆类及豆制品,6,1816,37,20,31,0,9,0
-嫩豆腐,豆类及豆制品,6,253,7,3,1,0,0,0
-纳豆,豆类及豆制品,7,883,19,11,12,0,5,0
-羽扇豆,豆类及豆制品,12,1554,36,9,40,0,18,0
-老豆腐,豆类及豆制品,7,326,9,4,2,0,0,0
-花生,豆类及豆制品,1,2374,25,49,16,0,8,0
-花生酱,豆类及豆制品,-6,2464,24,49,21,4,8,0
-蚕豆,豆类及豆制品,14,1425,26,1,58,0,25,0
-豆浆,豆类及豆制品,5,226,3,1,6,0,0,0
-鹰嘴豆,豆类及豆制品,8,1581,20,6,62,0,12,0
-黄豆,豆类及豆制品,14,1443,22,2,60,0,25,0

+ 0 - 225
docs/参考资料/CSV/547982403-个体化食物推荐表.csv

@@ -1,225 +0,0 @@
-名称,分类,推荐指数,能量KJ,蛋白g,脂肪g,碳水化合物g,淀粉g,总膳食纤维g,胆固醇mg
-大麦,主食,12,1481,12,2,73,0,17,0
-小米,主食,5,1582,11,4,72,0,8,0
-小麦,主食,7,1423,10,1,75,0,12,0
-小麦面包,主食,-7,1116,10,3,48,36,4,0
-意大利面,主食,0,386,1,3,13,0,2,0
-燕麦,主食,32,297,17,6,66,0,1,0
-玉米粒,主食,39,298,1,0,14,14,0,0
-米饭,主食,-4,1527,7,0,79,0,1,0
-玉米饼,主食,6,912,5,2,44,0,6,0
-荞麦面粉,主食,1,1402,12,3,70,0,10,0
-葡萄干浆即食谷物,主食,0,1354,7,1,78,0,13,0
-面条,主食,-4,1609,14,4,71,0,3,84
-鸡蛋面包,主食,-3,1201,9,6,47,0,2,51
-黑麦面包,主食,0,1188,9,3,53,0,6,0
-冰淇淋,乳制品,-5,690,1,3,32,0,0,8
-奶油,乳制品,-7,515,3,10,4,0,0,35
-奶酪,乳制品,-4,1552,23,29,2,0,0,94
-牛奶,乳制品,4,268,3,3,4,0,0,14
-脱脂牛奶,乳制品,8,142,3,0,4,0,0,2
-黄油,乳制品,-27,2999,0,81,0,0,0,215
-山核桃,干果,-8,2889,9,71,13,0,9,0
-山核桃干,干果,-3,2749,12,64,18,0,6,0
-杏仁,干果,-2,2423,21,49,21,0,12,0
-开心果,干果,-8,2392,21,45,28,1,10,0
-松子,干果,-10,2816,13,68,13,1,3,0
-栗子,干果,47,1519,6,1,79,0,0,0
-核桃,干果,-6,2738,15,65,13,0,6,0
-椰肉,干果,0,1481,3,33,15,0,9,0
-榛子,干果,44,2629,14,60,16,0,9,0
-橡子,干果,42,1619,6,23,40,0,0,0
-腰果,干果,-4,2402,15,46,32,0,3,0
-芝麻酱,干果,1,2454,18,50,24,0,5,0
-莲子,干果,47,372,4,0,17,0,0,0
-葵花子,干果,-1,2445,20,51,20,0,8,0
-银杏坚果,干果,-2,1456,10,2,72,0,0,0
-比萨,快餐,-6,1121,10,12,29,18,2,14
-热狗,快餐,-9,1167,9,3,50,36,1,0
-鸡米花,快餐,-11,1469,17,21,21,18,1,40
-三文鱼,水产品,7,594,19,6,0,0,0,55
-凤尾鱼,水产品,7,548,20,4,0,0,0,60
-墨鱼,水产品,6,331,16,0,0,0,0,112
-大比目鱼,水产品,8,382,18,1,0,0,0,49
-大西洋鳕鱼,水产品,0,343,17,0,0,0,0,43
-小龙虾,水产品,8,322,15,0,0,0,0,114
-扇贝,水产品,1,289,12,0,3,2,0,24
-条纹鲈鱼,水产品,9,406,17,2,0,0,0,80
-海鲈鱼,水产品,3,332,15,1,0,0,0,52
-牡蛎,水产品,9,339,9,2,4,0,0,50
-白鲑,水产品,5,611,17,8,0,0,0,65
-石斑鱼,水产品,11,385,19,1,0,0,0,37
-章鱼,水产品,8,343,14,1,2,0,0,48
-虾,水产品,0,297,13,1,0,0,0,126
-蛤蜊,水产品,2,360,14,0,3,1,0,30
-蟹,水产品,8,364,18,1,0,0,0,78
-贻贝,水产品,4,360,11,2,3,0,0,28
-金枪鱼,水产品,8,602,23,4,0,0,0,38
-鱼子酱,水产品,-7,1105,24,17,4,0,0,588
-鱿鱼,水产品,5,385,15,1,3,0,0,233
-鲈鱼,水产品,9,381,19,0,0,0,0,90
-鲍鱼,水产品,4,439,17,0,6,0,0,85
-鲟鱼,水产品,6,439,16,4,0,0,0,60
-鲤鱼,水产品,5,531,17,5,0,0,0,66
-鲭鱼,水产品,2,858,18,13,0,0,0,70
-鲱鱼,水产品,0,661,17,9,0,0,0,60
-鲶鱼,水产品,8,519,20,4,0,0,0,59
-鲷鱼,水产品,9,418,20,1,0,0,0,37
-鲽鱼,水产品,2,294,12,1,0,0,0,45
-鳕鱼,水产品,9,364,18,0,0,0,0,41
-鳗鱼,水产品,2,770,18,11,0,0,0,126
-鳟鱼,水产品,5,619,20,6,0,0,0,58
-沙丁鱼,水产品,11,347,0,1,19,0,5,0
-黄尾,水产品,7,611,23,5,0,0,0,55
-龙虾,水产品,3,324,16,0,0,0,0,127
-无花果,水果,9,310,0,0,19,0,2,0
-李子,水果,19,192,0,0,11,0,1,0
-杏,水果,14,201,1,0,11,0,2,0
-杨桃,水果,45,128,1,0,6,0,2,0
-枣,水果,10,1176,4,0,72,0,6,0
-柠檬,水果,45,121,1,0,9,0,2,0
-柿子,水果,21,293,0,0,18,0,3,0
-桃,水果,14,165,0,0,9,0,1,0
-桑葚,水果,41,180,1,0,9,0,1,0
-梨,水果,43,239,0,0,15,0,3,0
-榴莲,水果,41,615,1,5,27,0,3,0
-樱桃,水果,23,1395,1,0,80,0,2,0
-哈密瓜,水果,16,141,0,0,8,0,0,0
-橘子,水果,14,197,0,0,11,0,2,0
-橙汁,水果,39,188,0,0,10,0,0,0
-橙皮,水果,24,405,1,0,25,0,10,0
-橙菠萝汁,水果,7,214,0,0,12,0,0,0
-油桃,水果,14,185,1,0,10,0,1,0
-猕猴桃,水果,30,255,1,0,14,0,3,0
-甜瓜,水果,3,150,0,0,9,0,0,0
-番木瓜,水果,31,179,0,0,10,0,1,0
-石榴,水果,39,346,1,1,18,0,4,0
-红苹果,水果,20,247,0,0,14,0,2,0
-芒果,水果,2,250,0,0,14,0,1,0
-苹果,水果,20,218,0,0,13,0,2,0
-苹果汁,水果,-13,191,0,0,11,0,0,0
-草莓,水果,34,136,0,0,7,0,2,0
-荔枝,水果,19,276,0,0,16,0,1,0
-菠萝,水果,14,209,0,0,13,0,1,0
-菠萝蜜,水果,20,397,1,0,23,1,1,0
-葡萄,水果,36,280,0,0,17,0,0,0
-葡萄干,水果,-20,264,1,0,15,0,0,0
-葡萄柚,水果,43,134,0,0,8,0,1,0
-蓝莓,水果,41,240,0,0,14,0,2,0
-蔓越莓,水果,31,191,0,0,11,0,3,0
-西瓜,水果,22,127,0,0,7,0,0,0
-覆盆子,水果,36,220,1,0,11,0,6,0
-面包果酱,水果,10,431,1,0,27,0,4,0
-香蕉,水果,19,371,1,0,22,5,2,0
-鳄梨,水果,34,670,2,14,8,0,6,0
-黑莓,水果,55,181,1,0,9,0,5,0
-龙眼,水果,45,251,1,0,15,0,1,0
-番茄汤,汤,5,165,0,0,9,0,0,0
-土豆蔬菜汤,汤,-2,126,1,1,3,0,0,1
-素食蔬菜汤,汤,-3,119,0,0,4,0,0,0
-火腿,肉类,-4,683,16,8,3,0,1,57
-火鸡,肉类,2,790,28,7,0,0,0,109
-烟熏火腿,肉类,-7,591,18,2,10,0,0,50
-烤肉,肉类,-6,1512,20,30,0,0,0,105
-烤鸭,肉类,-5,1410,18,28,0,0,0,84
-烧鹅,肉类,-2,1276,25,21,0,0,0,91
-牛肉汤,肉类,-2,25,1,0,0,0,0,0
-牛肉瘦,肉类,4,488,23,2,0,0,0,55
-牛肉肥,肉类,-17,2845,10,70,0,0,0,95
-牛蛙,肉类,5,305,16,0,0,0,0,50
-猪培根,肉类,-16,1744,12,39,1,0,0,66
-猪头肉,肉类,-10,658,13,10,0,0,0,69
-猪瘦肉,肉类,6,562,21,4,0,0,0,64
-猪耳朵,肉类,0,695,15,10,0,0,0,90
-猪肝,肉类,9,690,26,4,3,0,0,355
-猪脑,肉类,-9,577,12,9,0,0,0,2552
-猪蹄,肉类,-3,889,23,12,0,0,0,88
-瘦羊肉,肉类,5,862,28,9,0,0,0,92
-肉丸,肉类,-13,1196,14,22,8,2,2,66
-肥猪肉,肉类,-18,2449,10,60,0,0,0,81
-肥羊肉,肉类,-19,2782,6,70,0,0,0,90
-鸡心,肉类,5,640,15,9,0,0,0,136
-鸡汤,肉类,-5,26,0,0,0,0,0,2
-鸡肉,肉类,-3,604,28,3,0,0,0,86
-鸡肝,肉类,5,496,16,4,0,0,0,345
-鹅肝,肉类,9,556,16,4,6,0,0,515
-鹌鹑,肉类,3,803,19,12,0,0,0,76
-南瓜,蔬菜,57,109,1,0,6,0,0,0
-卷心菜,蔬菜,45,103,1,0,5,0,2,0
-四季豆,蔬菜,64,131,1,0,6,0,2,0
-土豆,蔬菜,54,322,2,0,17,15,2,0
-土豆面粉,蔬菜,53,1493,6,0,83,0,5,0
-大白菜,蔬菜,64,55,1,0,2,0,1,0
-大蒜,蔬菜,43,623,6,0,33,0,2,0
-大豆,蔬菜,62,614,12,6,11,0,4,0
-小南瓜,蔬菜,0,69,1,0,3,0,1,0
-小萝卜,蔬菜,63,76,0,0,4,0,1,0
-山药,蔬菜,53,343,1,0,20,0,0,0
-扁豆,豆类及豆制品,54,1473,24,1,63,49,10,0
-木薯,蔬菜,38,667,1,0,38,0,1,0
-洋葱,蔬菜,46,166,1,0,9,0,1,0
-炒蘑菇,蔬菜,13,110,3,0,4,0,1,0
-炒香菇,蔬菜,10,162,3,0,7,0,3,0
-牛蒡根,蔬菜,71,302,1,0,17,0,3,0
-甘薯,蔬菜,42,359,1,0,20,12,3,0
-甜椒,蔬菜,57,84,0,0,4,0,1,0
-甜玉米,蔬菜,45,360,3,1,18,5,2,0
-甜菜,蔬菜,60,180,1,0,9,0,2,0
-甜菜叶,蔬菜,62,92,2,0,4,0,3,0
-生姜,蔬菜,71,75,0,0,3,0,1,0
-生菜,蔬菜,59,62,1,0,2,0,1,0
-番茄汁,蔬菜,0,72,0,0,3,0,0,0
-白菜,蔬菜,56,48,1,0,1,0,1,0
-白萝卜,蔬菜,66,59,1,0,2,0,1,0
-白蘑菇,蔬菜,56,93,3,0,3,0,1,0
-秋葵,蔬菜,56,138,1,0,7,0,3,0
-竹笋,蔬菜,66,115,2,0,5,0,2,0
-红心萝卜,蔬菜,65,132,1,0,7,0,3,0
-红豆,蔬菜,24,121,4,0,4,0,0,0
-绿豆,蔬菜,24,126,3,0,5,0,1,0
-羽衣甘蓝,蔬菜,67,207,4,0,8,0,3,0
-胡萝卜,蔬菜,40,173,0,0,9,1,2,0
-芋头,蔬菜,58,469,1,0,26,0,4,0
-芝麻,蔬菜,54,2397,17,49,23,0,11,0
-芥末,蔬菜,68,114,2,0,4,0,3,0
-芦笋,蔬菜,64,85,2,0,3,0,2,0
-花椒,蔬菜,65,80,0,0,4,0,1,0
-花椰菜,蔬菜,57,104,1,0,4,0,2,0
-芹菜,蔬菜,55,67,0,0,2,0,1,0
-苦瓜,蔬菜,57,126,5,0,3,0,0,0
-茄子,蔬菜,54,104,0,0,5,0,3,0
-苋菜叶,蔬菜,36,97,2,0,4,0,0,0
-菊苣,蔬菜,67,71,0,0,4,0,3,0
-菜豆,蔬菜,62,280,6,0,13,0,0,0
-菠菜,蔬菜,61,97,2,0,3,0,2,0
-蕨类,蔬菜,66,143,4,0,5,0,0,0
-藜,蔬菜,68,180,4,0,7,0,4,0
-蘑菇,蔬菜,57,141,2,0,6,0,2,0
-西兰花,蔬菜,64,141,2,0,6,0,2,0
-西红柿,蔬菜,66,74,0,0,3,0,1,0
-豆芽,蔬菜,59,510,13,6,9,0,1,0
-豇豆,蔬菜,63,376,2,0,18,0,5,0
-豌豆,豆类及豆制品,65,1435,21,1,62,0,15,0
-辣椒,蔬菜,46,88,0,0,5,0,1,0
-韭菜,蔬菜,40,126,3,0,4,0,2,0
-香菇,蔬菜,59,160,1,0,6,0,3,0
-黄瓜,蔬菜,54,65,0,0,3,0,0,0
-水煮蛋,蛋类,-6,597,12,9,0,0,0,370
-炒蛋,蛋类,-9,621,9,10,1,0,0,277
-煎蛋,蛋类,-10,643,10,11,0,0,0,313
-鸡蛋,蛋类,-5,599,12,9,0,0,0,372
-鸡蛋白,蛋类,4,216,10,0,0,0,0,0
-鸡蛋黄,蛋类,-12,1346,15,26,3,0,0,1085
-鹌鹑蛋,蛋类,-6,663,13,11,0,0,0,844
-利马豆,豆类及豆制品,15,1414,21,0,63,0,19,0
-大豆面粉,豆类及豆制品,7,1816,37,20,31,0,9,0
-嫩豆腐,豆类及豆制品,9,253,7,3,1,0,0,0
-纳豆,豆类及豆制品,9,883,19,11,12,0,5,0
-羽扇豆,豆类及豆制品,15,1554,36,9,40,0,18,0
-老豆腐,豆类及豆制品,10,326,9,4,2,0,0,0
-花生,豆类及豆制品,1,2374,25,49,16,0,8,0
-花生酱,豆类及豆制品,-8,2464,24,49,21,4,8,0
-蚕豆,豆类及豆制品,17,1425,26,1,58,0,25,0
-豆浆,豆类及豆制品,8,226,3,1,6,0,0,0
-鹰嘴豆,豆类及豆制品,9,1581,20,6,62,0,12,0
-黄豆,豆类及豆制品,17,1443,22,2,60,0,25,0

+ 0 - 9
docs/参考资料/CSV/主要消化道致病菌.csv

@@ -1,9 +0,0 @@
-致病菌,501999942-某人,530010234-侯,547982403,儿童示例,朱评估报告
-幽⻔螺杆菌,0%,,0%,,
-幽门螺杆菌,,0%,,,0%
-弯曲杆菌,0%,0%,0%,,0%
-志贺⽒菌,0%,,0%,,
-志贺氏菌,,0%,,,0%
-沙⻔⽒菌,0%,,0%,,
-沙门氏菌,,0%,,,0%
-艰难梭菌,0%,0%,0%,,0%

+ 0 - 6
docs/参考资料/CSV/主要营养评估.csv

@@ -1,6 +0,0 @@
-指标,501999942-某人,530010234-侯,547982403,儿童示例,朱评估报告
-乳制品,36,66,36,28,42
-碳水化合物,96,44,67,85,76
-纤维素,96,58,75,60,81
-脂肪,71,59,89,62,59
-蛋白质,44,93,83,52,65

+ 0 - 225
docs/参考资料/CSV/儿童示例-个体化食物推荐表.csv

@@ -1,225 +0,0 @@
-名称,分类,推荐指数,能量KJ,蛋白g,脂肪g,碳水化合物g,淀粉g,总膳食纤维g,胆固醇mg
-大麦,主食,20,1481,12,2,73,0,17,0
-小米,主食,9,1582,11,4,72,0,8,0
-小麦,主食,1,1423,10,1,75,0,12,0
-小麦面包,主食,-17,1116,10,3,48,36,4,0
-意大利面,主食,-5,386,1,3,13,0,2,0
-燕麦,主食,38,297,17,6,66,0,1,0
-玉米粒,主食,42,298,1,0,14,14,0,0
-米饭,主食,-4,1527,7,0,79,0,1,0
-玉米饼,主食,6,912,5,2,44,0,6,0
-荞麦面粉,主食,0,1402,12,3,70,0,10,0
-葡萄干浆即食谷物,主食,0,1354,7,1,78,0,13,0
-面条,主食,-1,1609,14,4,71,0,3,84
-鸡蛋面包,主食,-2,1201,9,6,47,0,2,51
-黑麦面包,主食,3,1188,9,3,53,0,6,0
-冰淇淋,乳制品,-15,690,1,3,32,0,0,8
-奶油,乳制品,-10,515,3,10,4,0,0,35
-奶酪,乳制品,8,1552,23,29,2,0,0,94
-牛奶,乳制品,10,268,3,3,4,0,0,14
-脱脂牛奶,乳制品,15,142,3,0,4,0,0,2
-黄油,乳制品,-50,2999,0,81,0,0,0,215
-山核桃,干果,-22,2889,9,71,13,0,9,0
-山核桃干,干果,-9,2749,12,64,18,0,6,0
-杏仁,干果,-5,2423,21,49,21,0,12,0
-开心果,干果,-15,2392,21,45,28,1,10,0
-松子,干果,-20,2816,13,68,13,1,3,0
-栗子,干果,54,1519,6,1,79,0,0,0
-核桃,干果,-15,2738,15,65,13,0,6,0
-椰肉,干果,0,1481,3,33,15,0,9,0
-榛子,干果,38,2629,14,60,16,0,9,0
-橡子,干果,36,1619,6,23,40,0,0,0
-腰果,干果,-5,2402,15,46,32,0,3,0
-芝麻酱,干果,4,2454,18,50,24,0,5,0
-莲子,干果,52,372,4,0,17,0,0,0
-葵花子,干果,-2,2445,20,51,20,0,8,0
-银杏坚果,干果,2,1456,10,2,72,0,0,0
-比萨,快餐,-6,1121,10,12,29,18,2,14
-热狗,快餐,-7,1167,9,3,50,36,1,0
-鸡米花,快餐,-12,1469,17,21,21,18,1,40
-三文鱼,水产品,22,594,19,6,0,0,0,55
-凤尾鱼,水产品,26,548,20,4,0,0,0,60
-墨鱼,水产品,27,331,16,0,0,0,0,112
-大比目鱼,水产品,25,382,18,1,0,0,0,49
-大西洋鳕鱼,水产品,0,343,17,0,0,0,0,43
-小龙虾,水产品,24,322,15,0,0,0,0,114
-扇贝,水产品,14,289,12,0,3,2,0,24
-条纹鲈鱼,水产品,28,406,17,2,0,0,0,80
-海鲈鱼,水产品,18,332,15,1,0,0,0,52
-牡蛎,水产品,28,339,9,2,4,0,0,50
-白鲑,水产品,16,611,17,8,0,0,0,65
-石斑鱼,水产品,30,385,19,1,0,0,0,37
-章鱼,水产品,29,343,14,1,2,0,0,48
-虾,水产品,14,297,13,1,0,0,0,126
-蛤蜊,水产品,20,360,14,0,3,1,0,30
-蟹,水产品,30,364,18,1,0,0,0,78
-贻贝,水产品,21,360,11,2,3,0,0,28
-金枪鱼,水产品,26,602,23,4,0,0,0,38
-鱼子酱,水产品,1,1105,24,17,4,0,0,588
-鱿鱼,水产品,19,385,15,1,3,0,0,233
-鲈鱼,水产品,27,381,19,0,0,0,0,90
-鲍鱼,水产品,21,439,17,0,6,0,0,85
-鲟鱼,水产品,20,439,16,4,0,0,0,60
-鲤鱼,水产品,16,531,17,5,0,0,0,66
-鲭鱼,水产品,14,858,18,13,0,0,0,70
-鲱鱼,水产品,5,661,17,9,0,0,0,60
-鲶鱼,水产品,27,519,20,4,0,0,0,59
-鲷鱼,水产品,27,418,20,1,0,0,0,37
-鲽鱼,水产品,14,294,12,1,0,0,0,45
-鳕鱼,水产品,27,364,18,0,0,0,0,41
-鳗鱼,水产品,11,770,18,11,0,0,0,126
-鳟鱼,水产品,20,619,20,6,0,0,0,58
-沙丁鱼,水产品,13,347,0,1,19,0,5,0
-黄尾,水产品,24,611,23,5,0,0,0,55
-龙虾,水产品,22,324,16,0,0,0,0,127
-无花果,水果,8,310,0,0,19,0,2,0
-李子,水果,2,192,0,0,11,0,1,0
-杏,水果,-7,201,1,0,11,0,2,0
-杨桃,水果,56,128,1,0,6,0,2,0
-枣,水果,-3,1176,4,0,72,0,6,0
-柠檬,水果,56,121,1,0,9,0,2,0
-柿子,水果,5,293,0,0,18,0,3,0
-桃,水果,-8,165,0,0,9,0,1,0
-桑葚,水果,46,180,1,0,9,0,1,0
-梨,水果,43,239,0,0,15,0,3,0
-榴莲,水果,47,615,1,5,27,0,3,0
-樱桃,水果,10,1395,1,0,80,0,2,0
-哈密瓜,水果,2,141,0,0,8,0,0,0
-橘子,水果,-5,197,0,0,11,0,2,0
-橙汁,水果,48,188,0,0,10,0,0,0
-橙皮,水果,37,405,1,0,25,0,10,0
-橙菠萝汁,水果,12,214,0,0,12,0,0,0
-油桃,水果,-9,185,1,0,10,0,1,0
-猕猴桃,水果,34,255,1,0,14,0,3,0
-甜瓜,水果,-11,150,0,0,9,0,0,0
-番木瓜,水果,33,179,0,0,10,0,1,0
-石榴,水果,37,346,1,1,18,0,4,0
-红苹果,水果,-1,247,0,0,14,0,2,0
-芒果,水果,-15,250,0,0,14,0,1,0
-苹果,水果,1,218,0,0,13,0,2,0
-苹果汁,水果,-40,191,0,0,11,0,0,0
-草莓,水果,36,136,0,0,7,0,2,0
-荔枝,水果,26,276,0,0,16,0,1,0
-菠萝,水果,-1,209,0,0,13,0,1,0
-菠萝蜜,水果,10,397,1,0,23,1,1,0
-葡萄,水果,33,280,0,0,17,0,0,0
-葡萄干,水果,-43,264,1,0,15,0,0,0
-葡萄柚,水果,52,134,0,0,8,0,1,0
-蓝莓,水果,31,240,0,0,14,0,2,0
-蔓越莓,水果,25,191,0,0,11,0,3,0
-西瓜,水果,9,127,0,0,7,0,0,0
-覆盆子,水果,33,220,1,0,11,0,6,0
-面包果酱,水果,11,431,1,0,27,0,4,0
-香蕉,水果,3,371,1,0,22,5,2,0
-鳄梨,水果,31,670,2,14,8,0,6,0
-黑莓,水果,53,181,1,0,9,0,5,0
-龙眼,水果,60,251,1,0,15,0,1,0
-番茄汤,汤,5,165,0,0,9,0,0,0
-土豆蔬菜汤,汤,-3,126,1,1,3,0,0,1
-素食蔬菜汤,汤,-11,119,0,0,4,0,0,0
-火腿,肉类,3,683,16,8,3,0,1,57
-火鸡,肉类,16,790,28,7,0,0,0,109
-烟熏火腿,肉类,-1,591,18,2,10,0,0,50
-烤肉,肉类,-1,1512,20,30,0,0,0,105
-烤鸭,肉类,-1,1410,18,28,0,0,0,84
-烧鹅,肉类,5,1276,25,21,0,0,0,91
-牛肉汤,肉类,-9,25,1,0,0,0,0,0
-牛肉瘦,肉类,11,488,23,2,0,0,0,55
-牛肉肥,肉类,-24,2845,10,70,0,0,0,95
-牛蛙,肉类,9,305,16,0,0,0,0,50
-猪培根,肉类,-25,1744,12,39,1,0,0,66
-猪头肉,肉类,-18,658,13,10,0,0,0,69
-猪瘦肉,肉类,21,562,21,4,0,0,0,64
-猪耳朵,肉类,10,695,15,10,0,0,0,90
-猪肝,肉类,30,690,26,4,3,0,0,355
-猪脑,肉类,-12,577,12,9,0,0,0,2552
-猪蹄,肉类,-6,889,23,12,0,0,0,88
-瘦羊肉,肉类,24,862,28,9,0,0,0,92
-肉丸,肉类,-26,1196,14,22,8,2,2,66
-肥猪肉,肉类,-28,2449,10,60,0,0,0,81
-肥羊肉,肉类,-29,2782,6,70,0,0,0,90
-鸡心,肉类,20,640,15,9,0,0,0,136
-鸡汤,肉类,-17,26,0,0,0,0,0,2
-鸡肉,肉类,4,604,28,3,0,0,0,86
-鸡肝,肉类,22,496,16,4,0,0,0,345
-鹅肝,肉类,31,556,16,4,6,0,0,515
-鹌鹑,肉类,14,803,19,12,0,0,0,76
-南瓜,蔬菜,61,109,1,0,6,0,0,0
-卷心菜,蔬菜,49,103,1,0,5,0,2,0
-四季豆,蔬菜,63,131,1,0,6,0,2,0
-土豆,蔬菜,53,322,2,0,17,15,2,0
-土豆面粉,蔬菜,56,1493,6,0,83,0,5,0
-大白菜,蔬菜,79,55,1,0,2,0,1,0
-大蒜,蔬菜,51,623,6,0,33,0,2,0
-大豆,蔬菜,75,614,12,6,11,0,4,0
-小南瓜,蔬菜,0,69,1,0,3,0,1,0
-小萝卜,蔬菜,72,76,0,0,4,0,1,0
-山药,蔬菜,49,343,1,0,20,0,0,0
-扁豆,豆类及豆制品,60,1473,24,1,63,49,10,0
-木薯,蔬菜,37,667,1,0,38,0,1,0
-洋葱,蔬菜,35,166,1,0,9,0,1,0
-炒蘑菇,蔬菜,21,110,3,0,4,0,1,0
-炒香菇,蔬菜,13,162,3,0,7,0,3,0
-牛蒡根,蔬菜,72,302,1,0,17,0,3,0
-甘薯,蔬菜,27,359,1,0,20,12,3,0
-甜椒,蔬菜,67,84,0,0,4,0,1,0
-甜玉米,蔬菜,37,360,3,1,18,5,2,0
-甜菜,蔬菜,65,180,1,0,9,0,2,0
-甜菜叶,蔬菜,78,92,2,0,4,0,3,0
-生姜,蔬菜,83,75,0,0,3,0,1,0
-生菜,蔬菜,65,62,1,0,2,0,1,0
-番茄汁,蔬菜,6,72,0,0,3,0,0,0
-白菜,蔬菜,70,48,1,0,1,0,1,0
-白萝卜,蔬菜,78,59,1,0,2,0,1,0
-白蘑菇,蔬菜,57,93,3,0,3,0,1,0
-秋葵,蔬菜,59,138,1,0,7,0,3,0
-竹笋,蔬菜,76,115,2,0,5,0,2,0
-红心萝卜,蔬菜,79,132,1,0,7,0,3,0
-红豆,蔬菜,38,121,4,0,4,0,0,0
-绿豆,蔬菜,33,126,3,0,5,0,1,0
-羽衣甘蓝,蔬菜,82,207,4,0,8,0,3,0
-胡萝卜,蔬菜,24,173,0,0,9,1,2,0
-芋头,蔬菜,59,469,1,0,26,0,4,0
-芝麻,蔬菜,56,2397,17,49,23,0,11,0
-芥末,蔬菜,81,114,2,0,4,0,3,0
-芦笋,蔬菜,66,85,2,0,3,0,2,0
-花椒,蔬菜,72,80,0,0,4,0,1,0
-花椰菜,蔬菜,66,104,1,0,4,0,2,0
-芹菜,蔬菜,54,67,0,0,2,0,1,0
-苦瓜,蔬菜,74,126,5,0,3,0,0,0
-茄子,蔬菜,49,104,0,0,5,0,3,0
-苋菜叶,蔬菜,52,97,2,0,4,0,0,0
-菊苣,蔬菜,72,71,0,0,4,0,3,0
-菜豆,蔬菜,76,280,6,0,13,0,0,0
-菠菜,蔬菜,75,97,2,0,3,0,2,0
-蕨类,蔬菜,78,143,4,0,5,0,0,0
-藜,蔬菜,84,180,4,0,7,0,4,0
-蘑菇,蔬菜,56,141,2,0,6,0,2,0
-西兰花,蔬菜,72,141,2,0,6,0,2,0
-西红柿,蔬菜,67,74,0,0,3,0,1,0
-豆芽,蔬菜,72,510,13,6,9,0,1,0
-豇豆,蔬菜,68,376,2,0,18,0,5,0
-豌豆,豆类及豆制品,78,1435,21,1,62,0,15,0
-辣椒,蔬菜,57,88,0,0,5,0,1,0
-韭菜,蔬菜,46,126,3,0,4,0,2,0
-香菇,蔬菜,59,160,1,0,6,0,3,0
-黄瓜,蔬菜,51,65,0,0,3,0,0,0
-水煮蛋,蛋类,-7,597,12,9,0,0,0,370
-炒蛋,蛋类,-12,621,9,10,1,0,0,277
-煎蛋,蛋类,-13,643,10,11,0,0,0,313
-鸡蛋,蛋类,-6,599,12,9,0,0,0,372
-鸡蛋白,蛋类,19,216,10,0,0,0,0,0
-鸡蛋黄,蛋类,-20,1346,15,26,3,0,0,1085
-鹌鹑蛋,蛋类,-5,663,13,11,0,0,0,844
-利马豆,豆类及豆制品,29,1414,21,0,63,0,19,0
-大豆面粉,豆类及豆制品,19,1816,37,20,31,0,9,0
-嫩豆腐,豆类及豆制品,18,253,7,3,1,0,0,0
-纳豆,豆类及豆制品,19,883,19,11,12,0,5,0
-羽扇豆,豆类及豆制品,29,1554,36,9,40,0,18,0
-老豆腐,豆类及豆制品,22,326,9,4,2,0,0,0
-花生,豆类及豆制品,5,2374,25,49,16,0,8,0
-花生酱,豆类及豆制品,-12,2464,24,49,21,4,8,0
-蚕豆,豆类及豆制品,30,1425,26,1,58,0,25,0
-豆浆,豆类及豆制品,13,226,3,1,6,0,0,0
-鹰嘴豆,豆类及豆制品,19,1581,20,6,62,0,12,0
-黄豆,豆类及豆制品,29,1443,22,2,60,0,25,0

+ 0 - 3
docs/参考资料/CSV/微量元素评估.csv

@@ -1,3 +0,0 @@
-微量元素,501999942-某人,530010234-侯,547982403,儿童示例,朱评估报告
-铁,2,81,66,3,4
-锌,52,73,36,9,33

+ 0 - 10
docs/参考资料/CSV/抗生素风险评估.csv

@@ -1,10 +0,0 @@
-抗生素,501999942-某人,530010234-侯,547982403,儿童示例,朱评估报告
-β-内酰胺酶类,20,67,70,81,76
-呋喃类,82,82,82,86,82
-喹诺酮类,30,51,64,61,11
-四环素类,48,58,69,96,96
-大环内酯类,39,62,65,97,95
-氨基糖苷类,5,68,71,94,97
-氯霉素类,8,63,70,57,86
-甲氧苄啶类,55,48,55,95,93
-磺胺类,61,51,37,36,73

+ 0 - 6
docs/参考资料/CSV/报告概述.csv

@@ -1,6 +0,0 @@
-姓名,编号,年龄,性别,肠道预测年龄,肠型,肠道菌群平衡,菌群多样性,有益菌,有害菌,核心菌属,健康总分,菌群健康,慢病控制,营养均衡
-某人,501999942,53岁,男,55.52岁,普雷沃⽒菌型,38,50,22,26,85,57,76,64,30
-530010234-侯,530010234,12岁,男,10.68岁,拟杆菌型,31,37,34,78,77,68,53,76,68
-547982403,547982403,53岁,,57.71岁,拟杆菌型,39,86,25,41,83,78,81,78,74
-儿童示例,,8岁,男,9.12岁,拟杆菌型,38,72,23,37,65,70,74,60,83
-朱明泽,590646194,8岁,男,10.63岁,拟杆菌型肠道菌群平衡37中等菌群多样性77稳定有益菌22中等有害菌34正常核心菌属81正常基本信息,37,77,22,34,81,81,80,80,82

+ 0 - 225
docs/参考资料/CSV/推荐指数汇总.csv

@@ -1,225 +0,0 @@
-名称,分类,能量KJ,蛋白g,脂肪g,碳水化合物g,淀粉g,总膳食纤维g,胆固醇mg,501999942-某人,530010234-侯,547982403,儿童示例,朱评估报告
-大麦,主食,1481,12,2,73,0,17,0,17,10,12,20,10
-小米,主食,1582,11,4,72,0,8,0,5,5,5,9,4
-小麦,主食,1423,10,1,75,0,12,0,10,3,7,1,4
-小麦面包,主食,1116,10,3,48,36,4,0,-14,-7,-7,-17,-6
-意大利面,主食,386,1,3,13,0,2,0,-4,0,0,-5,-1
-燕麦,主食,297,17,6,66,0,1,0,35,31,32,38,31
-玉米粒,主食,298,1,0,14,14,0,0,38,39,39,42,38
-米饭,主食,1527,7,0,79,0,1,0,-12,-1,-4,-4,-3
-玉米饼,主食,912,5,2,44,0,6,0,7,4,6,6,4
-荞麦面粉,主食,1402,12,3,70,0,10,0,0,1,1,0,0
-葡萄干浆即食谷物,主食,1354,7,1,78,0,13,0,0,0,0,0,0
-面条,主食,1609,14,4,71,0,3,84,-10,-1,-4,-1,-2
-鸡蛋面包,主食,1201,9,6,47,0,2,51,-11,-1,-3,-2,-2
-黑麦面包,主食,1188,9,3,53,0,6,0,-6,1,0,3,0
-冰淇淋,乳制品,690,1,3,32,0,0,8,-11,-4,-5,-15,-5
-奶油,乳制品,515,3,10,4,0,0,35,-20,-5,-7,-10,-7
-奶酪,乳制品,1552,23,29,2,0,0,94,-8,-1,-4,8,-1
-牛奶,乳制品,268,3,3,4,0,0,14,9,3,4,10,4
-脱脂牛奶,乳制品,142,3,0,4,0,0,2,15,6,8,15,7
-黄油,乳制品,2999,0,81,0,0,0,215,-48,-20,-27,-50,-23
-山核桃,干果,2889,9,71,13,0,9,0,-15,-7,-8,-22,-8
-山核桃干,干果,2749,12,64,18,0,6,0,-5,-3,-3,-9,-3
-杏仁,干果,2423,21,49,21,0,12,0,-3,-2,-2,-5,-2
-开心果,干果,2392,21,45,28,1,10,0,-13,-6,-8,-15,-7
-松子,干果,2816,13,68,13,1,3,0,-17,-7,-10,-20,-9
-栗子,干果,1519,6,1,79,0,0,0,37,50,47,54,48
-核桃,干果,2738,15,65,13,0,6,0,-10,-5,-6,-15,-6
-椰肉,干果,1481,3,33,15,0,9,0,0,0,0,0,0
-榛子,干果,2629,14,60,16,0,9,0,40,45,44,38,44
-橡子,干果,1619,6,23,40,0,0,0,36,44,42,36,43
-腰果,干果,2402,15,46,32,0,3,0,-9,-3,-4,-5,-3
-芝麻酱,干果,2454,18,50,24,0,5,0,3,1,1,4,1
-莲子,干果,372,4,0,17,0,0,0,53,45,47,52,46
-葵花子,干果,2445,20,51,20,0,8,0,-1,-1,-1,-2,-1
-银杏坚果,干果,1456,10,2,72,0,0,0,-8,0,-2,2,
-比萨,快餐,1121,10,12,29,18,2,14,-12,-4,-6,-6,-4
-热狗,快餐,1167,9,3,50,36,1,0,-17,-5,-9,-7,-6
-鸡米花,快餐,1469,17,21,21,18,1,40,-20,-7,-11,-12,-8
-三文鱼,水产品,594,19,6,0,0,0,55,16,6,7,22,7
-凤尾鱼,水产品,548,20,4,0,0,0,60,15,6,7,26,8
-墨鱼,水产品,331,16,0,0,0,0,112,8,6,6,27,7
-大比目鱼,水产品,382,18,1,0,0,0,49,15,7,8,25,8
-大西洋鳕鱼,水产品,343,17,0,0,0,0,43,0,0,0,0,0
-小龙虾,水产品,322,15,0,0,0,0,114,13,7,8,24,8
-扇贝,水产品,289,12,0,3,2,0,24,0,2,1,14,2
-条纹鲈鱼,水产品,406,17,2,0,0,0,80,18,8,9,28,1
-海鲈鱼,水产品,332,15,1,0,0,0,52,5,4,3,18,4
-牡蛎,水产品,339,9,2,4,0,0,50,14,9,9,28,1
-白鲑,水产品,611,17,8,0,0,0,65,10,4,5,16,5
-石斑鱼,水产品,385,19,1,0,0,0,37,23,9,11,30,11
-章鱼,水产品,343,14,1,2,0,0,48,11,9,8,29,9
-虾,水产品,297,13,1,0,0,0,126,-2,2,0,14,1
-蛤蜊,水产品,360,14,0,3,1,0,30,0,4,2,20,3
-蟹,水产品,364,18,1,0,0,0,78,13,9,8,30,1
-贻贝,水产品,360,11,2,3,0,0,28,4,5,4,21,5
-金枪鱼,水产品,602,23,4,0,0,0,38,15,7,8,26,8
-鱼子酱,水产品,1105,24,17,4,0,0,588,-19,-2,-7,1,-4
-鱿鱼,水产品,385,15,1,3,0,0,233,9,5,5,19,6
-鲈鱼,水产品,381,19,0,0,0,0,90,16,8,9,27,9
-鲍鱼,水产品,439,17,0,6,0,0,85,5,5,4,21,5
-鲟鱼,水产品,439,16,4,0,0,0,60,12,5,6,20,6
-鲤鱼,水产品,531,17,5,0,0,0,66,11,4,5,16,5
-鲭鱼,水产品,858,18,13,0,0,0,70,4,3,2,14,3
-鲱鱼,水产品,661,17,9,0,0,0,60,2,0,0,5,0
-鲶鱼,水产品,519,20,4,0,0,0,59,17,7,8,27,9
-鲷鱼,水产品,418,20,1,0,0,0,37,17,8,9,27,9
-鲽鱼,水产品,294,12,1,0,0,0,45,3,2,2,14,3
-鳕鱼,水产品,364,18,0,0,0,0,41,16,8,9,27,9
-鳗鱼,水产品,770,18,11,0,0,0,126,5,2,2,11,2
-鳟鱼,水产品,619,20,6,0,0,0,58,11,5,5,20,6
-沙丁鱼,水产品,347,0,1,19,0,5,0,19,8,11,13,9
-黄尾,水产品,611,23,5,0,0,0,55,17,6,7,24,8
-龙虾,水产品,324,16,0,0,0,0,127,3,5,3,22,5
-无花果,水果,310,0,0,19,0,2,0,15,7,9,8,7
-李子,水果,192,0,0,11,0,1,0,13,21,19,2,2
-杏,水果,201,1,0,11,0,2,0,2,17,14,-7,15
-杨桃,水果,128,1,0,6,0,2,0,57,41,45,56,43
-枣,水果,1176,4,0,72,0,6,0,-6,15,10,-3,13
-柠檬,水果,121,1,0,9,0,2,0,58,41,45,56,43
-柿子,水果,293,0,0,18,0,3,0,16,23,21,5,21
-桃,水果,165,0,0,9,0,1,0,3,17,14,-8,15
-桑葚,水果,180,1,0,9,0,1,0,50,37,41,46,39
-梨,水果,239,0,0,15,0,3,0,55,39,43,43,4
-榴莲,水果,615,1,5,27,0,3,0,43,39,41,47,39
-樱桃,水果,1395,1,0,80,0,2,0,20,24,23,10,23
-哈密瓜,水果,141,0,0,8,0,0,0,6,19,16,2,17
-橘子,水果,197,0,0,11,0,2,0,1,17,14,-5,15
-橙汁,水果,188,0,0,10,0,0,0,47,37,39,48,38
-橙皮,水果,405,1,0,25,0,10,0,38,21,24,37,22
-橙菠萝汁,水果,214,0,0,12,0,0,0,14,5,7,12,6
-油桃,水果,185,1,0,10,0,1,0,3,16,14,-9,15
-猕猴桃,水果,255,1,0,14,0,3,0,32,31,30,34,31
-甜瓜,水果,150,0,0,9,0,0,0,-4,5,3,-11,4
-番木瓜,水果,179,0,0,10,0,1,0,32,31,31,33,31
-石榴,水果,346,1,1,18,0,4,0,46,36,39,37,37
-红苹果,水果,247,0,0,14,0,2,0,13,21,20,-1,19
-芒果,水果,250,0,0,14,0,1,0,-11,6,2,-15,4
-苹果,水果,218,0,0,13,0,2,0,14,21,20,1,2
-苹果汁,水果,191,0,0,11,0,0,0,-19,-12,-13,-40,-13
-草莓,水果,136,0,0,7,0,2,0,37,34,34,36,34
-荔枝,水果,276,0,0,16,0,1,0,25,16,19,26,17
-菠萝,水果,209,0,0,13,0,1,0,1,18,14,-1,15
-菠萝蜜,水果,397,1,0,23,1,1,0,14,23,20,10,21
-葡萄,水果,280,0,0,17,0,0,0,40,34,36,33,34
-葡萄干,水果,264,1,0,15,0,0,0,-38,-15,-20,-43,-18
-葡萄柚,水果,134,0,0,8,0,1,0,54,40,43,52,41
-蓝莓,水果,240,0,0,14,0,2,0,40,41,41,31,41
-蔓越莓,水果,191,0,0,11,0,3,0,33,30,31,25,3
-西瓜,水果,127,0,0,7,0,0,0,19,23,22,9,22
-覆盆子,水果,220,1,0,11,0,6,0,42,33,36,33,34
-面包果酱,水果,431,1,0,27,0,4,0,15,7,10,11,7
-香蕉,水果,371,1,0,22,5,2,0,10,21,19,3,19
-鳄梨,水果,670,2,14,8,0,6,0,37,32,34,31,32
-黑莓,水果,181,1,0,9,0,5,0,61,53,55,53,54
-龙眼,水果,251,1,0,15,0,1,0,55,43,45,60,43
-番茄汤,汤,165,0,0,9,0,0,0,8,3,5,5,
-土豆蔬菜汤,汤,126,1,1,3,0,0,1,-5,-1,-2,-3,
-素食蔬菜汤,汤,119,0,0,4,0,0,0,-5,-4,-3,-11,
-火腿,肉类,683,16,8,3,0,1,57,-11,-2,-4,3,-2
-火鸡,肉类,790,28,7,0,0,0,109,4,3,2,16,3
-烟熏火腿,肉类,591,18,2,10,0,0,50,-14,-4,-7,-1,-5
-烤肉,肉类,1512,20,30,0,0,0,105,-11,-3,-6,-1,-4
-烤鸭,肉类,1410,18,28,0,0,0,84,-6,-3,-5,-1,-3
-烧鹅,肉类,1276,25,21,0,0,0,91,0,-1,-2,5,0
-牛肉汤,肉类,25,1,0,0,0,0,0,-2,-4,-2,-9,
-牛肉瘦,肉类,488,23,2,0,0,0,55,7,1,4,11,4
-牛肉肥,肉类,2845,10,70,0,0,0,95,-29,-12,-17,-24,-14
-牛蛙,肉类,305,16,0,0,0,0,50,12,1,5,9,4
-猪培根,肉类,1744,12,39,1,0,0,66,-28,-12,-16,-25,-14
-猪头肉,肉类,658,13,10,0,0,0,69,-18,-10,-10,-18,-9
-猪瘦肉,肉类,562,21,4,0,0,0,64,11,5,6,21,6
-猪耳朵,肉类,695,15,10,0,0,0,90,1,0,0,10,0
-猪肝,肉类,690,26,4,3,0,0,355,14,9,9,30,1
-猪脑,肉类,577,12,9,0,0,0,2552,-21,-6,-9,-12,-7
-猪蹄,肉类,889,23,12,0,0,0,88,1,-5,-3,-6,-2
-瘦羊肉,肉类,862,28,9,0,0,0,92,12,5,5,24,7
-肉丸,肉类,1196,14,22,8,2,2,66,-25,-12,-13,-26,-12
-肥猪肉,肉类,2449,10,60,0,0,0,81,-34,-13,-18,-28,-15
-肥羊肉,肉类,2782,6,70,0,0,0,90,-32,-13,-19,-29,-15
-鸡心,肉类,640,15,9,0,0,0,136,9,5,5,20,5
-鸡汤,肉类,26,0,0,0,0,0,2,-8,-6,-5,-17,
-鸡肉,肉类,604,28,3,0,0,0,86,-2,-1,-3,4,-1
-鸡肝,肉类,496,16,4,0,0,0,345,2,6,5,22,5
-鹅肝,肉类,556,16,4,6,0,0,515,9,10,9,31,1
-鹌鹑,肉类,803,19,12,0,0,0,76,8,2,3,14,4
-南瓜,蔬菜,109,1,0,6,0,0,0,66,55,57,61,56
-卷心菜,蔬菜,103,1,0,5,0,2,0,51,43,45,49,44
-四季豆,蔬菜,131,1,0,6,0,2,0,68,62,64,63,62
-土豆,蔬菜,322,2,0,17,15,2,0,57,52,54,53,53
-土豆面粉,蔬菜,1493,6,0,83,0,5,0,48,54,53,56,52
-大白菜,蔬菜,55,1,0,2,0,1,0,75,61,64,79,63
-大蒜,蔬菜,623,6,0,33,0,2,0,47,42,43,51,42
-大豆,蔬菜,614,12,6,11,0,4,0,72,59,62,75,61
-小南瓜,蔬菜,69,1,0,3,0,1,0,0,0,0,0,0
-小萝卜,蔬菜,76,0,0,4,0,1,0,74,59,63,72,61
-山药,蔬菜,343,1,0,20,0,0,0,56,52,53,49,52
-扁豆,豆类及豆制品,1473,24,1,63,49,10,0,55,54,54,60,53
-木薯,蔬菜,667,1,0,38,0,1,0,36,38,38,37,37
-洋葱,蔬菜,166,1,0,9,0,1,0,45,46,46,35,45
-炒蘑菇,蔬菜,110,3,0,4,0,1,0,24,9,13,21,11
-炒香菇,蔬菜,162,3,0,7,0,3,0,17,7,10,13,8
-牛蒡根,蔬菜,302,1,0,17,0,3,0,78,68,71,72,68
-甘薯,蔬菜,359,1,0,20,12,3,0,35,43,42,27,42
-甜椒,蔬菜,84,0,0,4,0,1,0,65,55,57,67,56
-甜玉米,蔬菜,360,3,1,18,5,2,0,42,46,45,37,45
-甜菜,蔬菜,180,1,0,9,0,2,0,67,58,60,65,58
-甜菜叶,蔬菜,92,2,0,4,0,3,0,68,60,62,78,61
-生姜,蔬菜,75,0,0,3,0,1,0,86,66,71,83,68
-生菜,蔬菜,62,1,0,2,0,1,0,68,56,59,65,58
-番茄汁,蔬菜,72,0,0,3,0,0,0,0,0,0,6,0
-白菜,蔬菜,48,1,0,1,0,1,0,59,55,56,70,56
-白萝卜,蔬菜,59,1,0,2,0,1,0,81,61,66,78,64
-白蘑菇,蔬菜,93,3,0,3,0,1,0,63,53,56,57,55
-秋葵,蔬菜,138,1,0,7,0,3,0,62,54,56,59,55
-竹笋,蔬菜,115,2,0,5,0,2,0,81,61,66,76,63
-红心萝卜,蔬菜,132,1,0,7,0,3,0,76,62,65,79,63
-红豆,蔬菜,121,4,0,4,0,0,0,38,20,24,38,23
-绿豆,蔬菜,126,3,0,5,0,1,0,35,20,24,33,22
-羽衣甘蓝,蔬菜,207,4,0,8,0,3,0,80,63,67,82,65
-胡萝卜,蔬菜,173,0,0,9,1,2,0,33,41,40,24,4
-芋头,蔬菜,469,1,0,26,0,4,0,62,56,58,59,56
-芝麻,蔬菜,2397,17,49,23,0,11,0,57,53,54,56,53
-芥末,蔬菜,114,2,0,4,0,3,0,83,63,68,81,66
-芦笋,蔬菜,85,2,0,3,0,2,0,71,61,64,66,62
-花椒,蔬菜,80,0,0,4,0,1,0,77,61,65,72,62
-花椰菜,蔬菜,104,1,0,4,0,2,0,63,56,57,66,56
-芹菜,蔬菜,67,0,0,2,0,1,0,60,52,55,54,53
-苦瓜,蔬菜,126,5,0,3,0,0,0,72,53,57,74,56
-茄子,蔬菜,104,0,0,5,0,3,0,59,52,54,49,52
-苋菜叶,蔬菜,97,2,0,4,0,0,0,50,33,36,52,35
-菊苣,蔬菜,71,0,0,4,0,3,0,83,61,67,72,64
-菜豆,蔬菜,280,6,0,13,0,0,0,70,59,62,76,61
-菠菜,蔬菜,97,2,0,3,0,2,0,68,59,61,75,6
-蕨类,蔬菜,143,4,0,5,0,0,0,80,61,66,78,64
-藜,蔬菜,180,4,0,7,0,4,0,83,65,68,84,67
-蘑菇,蔬菜,141,2,0,6,0,2,0,64,54,57,56,55
-西兰花,蔬菜,141,2,0,6,0,2,0,74,60,64,72,61
-西红柿,蔬菜,74,0,0,3,0,1,0,74,63,66,67,65
-豆芽,蔬菜,510,13,6,9,0,1,0,69,57,59,72,59
-豇豆,蔬菜,376,2,0,18,0,5,0,73,60,63,68,61
-豌豆,豆类及豆制品,1435,21,1,62,0,15,0,72,62,65,78,63
-辣椒,蔬菜,88,0,0,5,0,1,0,35,48,46,57,47
-韭菜,蔬菜,126,3,0,4,0,2,0,47,38,40,46,38
-香菇,蔬菜,160,1,0,6,0,3,0,63,56,59,59,56
-黄瓜,蔬菜,65,0,0,3,0,0,0,61,52,54,51,53
-水煮蛋,蛋类,597,12,9,0,0,0,370,-13,-4,-6,-7,-5
-炒蛋,蛋类,621,9,10,1,0,0,277,-22,-6,-9,-12,-8
-煎蛋,蛋类,643,10,11,0,0,0,313,-24,-7,-10,-13,-9
-鸡蛋,蛋类,599,12,9,0,0,0,372,-12,-3,-5,-6,-4
-鸡蛋白,蛋类,216,10,0,0,0,0,0,10,4,4,19,5
-鸡蛋黄,蛋类,1346,15,26,3,0,0,1085,-26,-8,-12,-20,-10
-鹌鹑蛋,蛋类,663,13,11,0,0,0,844,-14,-3,-6,-5,-4
-利马豆,豆类及豆制品,1414,21,0,63,0,19,0,21,13,15,29,13
-大豆面粉,豆类及豆制品,1816,37,20,31,0,9,0,11,6,7,19,7
-嫩豆腐,豆类及豆制品,253,7,3,1,0,0,0,18,6,9,18,8
-纳豆,豆类及豆制品,883,19,11,12,0,5,0,16,7,9,19,8
-羽扇豆,豆类及豆制品,1554,36,9,40,0,18,0,26,12,15,29,14
-老豆腐,豆类及豆制品,326,9,4,2,0,0,0,19,7,10,22,9
-花生,豆类及豆制品,2374,25,49,16,0,8,0,4,1,1,5,1
-花生酱,豆类及豆制品,2464,24,49,21,4,8,0,-14,-6,-8,-12,-7
-蚕豆,豆类及豆制品,1425,26,1,58,0,25,0,25,14,17,30,15
-豆浆,豆类及豆制品,226,3,1,6,0,0,0,19,5,8,13,7
-鹰嘴豆,豆类及豆制品,1581,20,6,62,0,12,0,12,8,9,19,8
-黄豆,豆类及豆制品,1443,22,2,60,0,25,0,27,14,17,29,15

+ 0 - 219
docs/参考资料/CSV/朱评估报告-个体化食物推荐表.csv

@@ -1,219 +0,0 @@
-名称,分类,推荐指数,能量KJ,蛋白g,脂肪g,碳水化合物g,淀粉g,总膳食纤维g,胆固醇mg
-大麦,主食,10,1481,12,2,73,0,17,0
-小米,主食,4,1582,11,4,72,0,8,0
-小麦,主食,4,1423,10,1,75,0,12,0
-小麦面包,主食,-6,1116,10,3,48,36,4,0
-意大利面,主食,-1,386,1,3,13,0,2,0
-燕麦,主食,31,297,17,6,66,0,1,0
-玉米粒,主食,38,298,1,0,14,14,0,0
-米饭,主食,-3,1527,7,0,79,0,1,0
-玉米饼,主食,4,912,5,2,44,0,6,0
-荞麦面粉,主食,0,1402,12,3,70,0,10,0
-葡萄干浆即食谷物,主食,0,1354,7,1,78,0,13,0
-面条,主食,-2,1609,14,4,71,0,3,84
-鸡蛋面包,主食,-2,1201,9,6,47,0,2,51
-黑麦面包,主食,0,1188,9,3,53,0,6,0
-冰淇淋,乳制品,-5,690,1,3,32,0,0,8
-奶油,乳制品,-7,515,3,10,4,0,0,35
-奶酪,乳制品,-1,1552,23,29,2,0,0,94
-牛奶,乳制品,4,268,3,3,4,0,0,14
-脱脂牛奶,乳制品,7,142,3,0,4,0,0,2
-黄油,乳制品,-23,2999,0,81,0,0,0,215
-山核桃,干果,-8,2889,9,71,13,0,9,0
-山核桃干,干果,-3,2749,12,64,18,0,6,0
-杏仁,干果,-2,2423,21,49,21,0,12,0
-开心果,干果,-7,2392,21,45,28,1,10,0
-松子,干果,-9,2816,13,68,13,1,3,0
-栗子,干果,48,1519,6,1,79,0,0,0
-核桃,干果,-6,2738,15,65,13,0,6,0
-椰肉,干果,0,1481,3,33,15,0,9,0
-榛子,干果,44,2629,14,60,16,0,9,0
-橡子,干果,43,1619,6,23,40,0,0,0
-腰果,干果,-3,2402,15,46,32,0,3,0
-芝麻酱,干果,1,2454,18,50,24,0,5,0
-莲子,干果,46,372,4,0,17,0,0,0
-葵花子,干果,-1,2445,20,51,20,0,8,0
-比萨,快餐,-4,1121,10,12,29,18,2,14
-热狗,快餐,-6,1167,9,3,50,36,1,0
-鸡米花,快餐,-8,1469,17,21,21,18,1,40
-三文鱼,水产品,7,594,19,6,0,0,0,55
-凤尾鱼,水产品,8,548,20,4,0,0,0,60
-墨鱼,水产品,7,331,16,0,0,0,0,112
-大比目鱼,水产品,8,382,18,1,0,0,0,49
-大西洋鳕鱼,水产品,0,343,17,0,0,0,0,43
-小龙虾,水产品,8,322,15,0,0,0,0,114
-扇贝,水产品,2,289,12,0,3,2,0,24
-条纹鲈鱼,水产品,1,406,17,2,0,0,0,80
-海鲈鱼,水产品,4,332,15,1,0,0,0,52
-牡蛎,水产品,1,339,9,2,4,0,0,50
-白鲑,水产品,5,611,17,8,0,0,0,65
-石斑鱼,水产品,11,385,19,1,0,0,0,37
-章鱼,水产品,9,343,14,1,2,0,0,48
-虾,水产品,1,297,13,1,0,0,0,126
-蛤蜊,水产品,3,360,14,0,3,1,0,30
-蟹,水产品,1,364,18,1,0,0,0,78
-贻贝,水产品,5,360,11,2,3,0,0,28
-金枪鱼,水产品,8,602,23,4,0,0,0,38
-鱼子酱,水产品,-4,1105,24,17,4,0,0,588
-鱿鱼,水产品,6,385,15,1,3,0,0,233
-鲈鱼,水产品,9,381,19,0,0,0,0,90
-鲍鱼,水产品,5,439,17,0,6,0,0,85
-鲟鱼,水产品,6,439,16,4,0,0,0,60
-鲤鱼,水产品,5,531,17,5,0,0,0,66
-鲭鱼,水产品,3,858,18,13,0,0,0,70
-鲱鱼,水产品,0,661,17,9,0,0,0,60
-鲶鱼,水产品,9,519,20,4,0,0,0,59
-鲷鱼,水产品,9,418,20,1,0,0,0,37
-鲽鱼,水产品,3,294,12,1,0,0,0,45
-鳕鱼,水产品,9,364,18,0,0,0,0,41
-鳗鱼,水产品,2,770,18,11,0,0,0,126
-鳟鱼,水产品,6,619,20,6,0,0,0,58
-沙丁鱼,水产品,9,347,0,1,19,0,5,0
-黄尾,水产品,8,611,23,5,0,0,0,55
-龙虾,水产品,5,324,16,0,0,0,0,127
-无花果,水果,7,310,0,0,19,0,2,0
-李子,水果,2,192,0,0,11,0,1,0
-杏,水果,15,201,1,0,11,0,2,0
-杨桃,水果,43,128,1,0,6,0,2,0
-枣,水果,13,1176,4,0,72,0,6,0
-柠檬,水果,43,121,1,0,9,0,2,0
-柿子,水果,21,293,0,0,18,0,3,0
-桃,水果,15,165,0,0,9,0,1,0
-桑葚,水果,39,180,1,0,9,0,1,0
-梨,水果,4,239,0,0,15,0,3,0
-榴莲,水果,39,615,1,5,27,0,3,0
-樱桃,水果,23,1395,1,0,80,0,2,0
-哈密瓜,水果,17,141,0,0,8,0,0,0
-橘子,水果,15,197,0,0,11,0,2,0
-橙汁,水果,38,188,0,0,10,0,0,0
-橙皮,水果,22,405,1,0,25,0,10,0
-橙菠萝汁,水果,6,214,0,0,12,0,0,0
-油桃,水果,15,185,1,0,10,0,1,0
-猕猴桃,水果,31,255,1,0,14,0,3,0
-甜瓜,水果,4,150,0,0,9,0,0,0
-番木瓜,水果,31,179,0,0,10,0,1,0
-石榴,水果,37,346,1,1,18,0,4,0
-红苹果,水果,19,247,0,0,14,0,2,0
-芒果,水果,4,250,0,0,14,0,1,0
-苹果,水果,2,218,0,0,13,0,2,0
-苹果汁,水果,-13,191,0,0,11,0,0,0
-草莓,水果,34,136,0,0,7,0,2,0
-荔枝,水果,17,276,0,0,16,0,1,0
-菠萝,水果,15,209,0,0,13,0,1,0
-菠萝蜜,水果,21,397,1,0,23,1,1,0
-葡萄,水果,34,280,0,0,17,0,0,0
-葡萄干,水果,-18,264,1,0,15,0,0,0
-葡萄柚,水果,41,134,0,0,8,0,1,0
-蓝莓,水果,41,240,0,0,14,0,2,0
-蔓越莓,水果,3,191,0,0,11,0,3,0
-西瓜,水果,22,127,0,0,7,0,0,0
-覆盆子,水果,34,220,1,0,11,0,6,0
-面包果酱,水果,7,431,1,0,27,0,4,0
-香蕉,水果,19,371,1,0,22,5,2,0
-鳄梨,水果,32,670,2,14,8,0,6,0
-黑莓,水果,54,181,1,0,9,0,5,0
-龙眼,水果,43,251,1,0,15,0,1,0
-火腿,肉类,-2,683,16,8,3,0,1,57
-火鸡,肉类,3,790,28,7,0,0,0,109
-烟熏火腿,肉类,-5,591,18,2,10,0,0,50
-烤肉,肉类,-4,1512,20,30,0,0,0,105
-烤鸭,肉类,-3,1410,18,28,0,0,0,84
-烧鹅,肉类,0,1276,25,21,0,0,0,91
-牛肉瘦,肉类,4,488,23,2,0,0,0,55
-牛肉肥,肉类,-14,2845,10,70,0,0,0,95
-牛蛙,肉类,4,305,16,0,0,0,0,50
-猪培根,肉类,-14,1744,12,39,1,0,0,66
-猪头肉,肉类,-9,658,13,10,0,0,0,69
-猪瘦肉,肉类,6,562,21,4,0,0,0,64
-猪耳朵,肉类,0,695,15,10,0,0,0,90
-猪肝,肉类,1,690,26,4,3,0,0,355
-猪脑,肉类,-7,577,12,9,0,0,0,2552
-猪蹄,肉类,-2,889,23,12,0,0,0,88
-瘦羊肉,肉类,7,862,28,9,0,0,0,92
-肉丸,肉类,-12,1196,14,22,8,2,2,66
-肥猪肉,肉类,-15,2449,10,60,0,0,0,81
-肥羊肉,肉类,-15,2782,6,70,0,0,0,90
-鸡心,肉类,5,640,15,9,0,0,0,136
-鸡肉,肉类,-1,604,28,3,0,0,0,86
-鸡肝,肉类,5,496,16,4,0,0,0,345
-鹅肝,肉类,1,556,16,4,6,0,0,515
-鹌鹑,肉类,4,803,19,12,0,0,0,76
-南瓜,蔬菜,56,109,1,0,6,0,0,0
-卷心菜,蔬菜,44,103,1,0,5,0,2,0
-四季豆,蔬菜,62,131,1,0,6,0,2,0
-土豆,蔬菜,53,322,2,0,17,15,2,0
-土豆面粉,蔬菜,52,1493,6,0,83,0,5,0
-大白菜,蔬菜,63,55,1,0,2,0,1,0
-大蒜,蔬菜,42,623,6,0,33,0,2,0
-大豆,蔬菜,61,614,12,6,11,0,4,0
-小南瓜,蔬菜,0,69,1,0,3,0,1,0
-小萝卜,蔬菜,61,76,0,0,4,0,1,0
-山药,蔬菜,52,343,1,0,20,0,0,0
-扁豆,豆类及豆制品,53,1473,24,1,63,49,10,0
-木薯,蔬菜,37,667,1,0,38,0,1,0
-洋葱,蔬菜,45,166,1,0,9,0,1,0
-炒蘑菇,蔬菜,11,110,3,0,4,0,1,0
-炒香菇,蔬菜,8,162,3,0,7,0,3,0
-牛蒡根,蔬菜,68,302,1,0,17,0,3,0
-甘薯,蔬菜,42,359,1,0,20,12,3,0
-甜椒,蔬菜,56,84,0,0,4,0,1,0
-甜玉米,蔬菜,45,360,3,1,18,5,2,0
-甜菜,蔬菜,58,180,1,0,9,0,2,0
-甜菜叶,蔬菜,61,92,2,0,4,0,3,0
-生姜,蔬菜,68,75,0,0,3,0,1,0
-生菜,蔬菜,58,62,1,0,2,0,1,0
-番茄汁,蔬菜,0,72,0,0,3,0,0,0
-白菜,蔬菜,56,48,1,0,1,0,1,0
-白萝卜,蔬菜,64,59,1,0,2,0,1,0
-白蘑菇,蔬菜,55,93,3,0,3,0,1,0
-秋葵,蔬菜,55,138,1,0,7,0,3,0
-竹笋,蔬菜,63,115,2,0,5,0,2,0
-红心萝卜,蔬菜,63,132,1,0,7,0,3,0
-红豆,蔬菜,23,121,4,0,4,0,0,0
-绿豆,蔬菜,22,126,3,0,5,0,1,0
-羽衣甘蓝,蔬菜,65,207,4,0,8,0,3,0
-胡萝卜,蔬菜,4,173,0,0,9,1,2,0
-芋头,蔬菜,56,469,1,0,26,0,4,0
-芝麻,蔬菜,53,2397,17,49,23,0,11,0
-芥末,蔬菜,66,114,2,0,4,0,3,0
-芦笋,蔬菜,62,85,2,0,3,0,2,0
-花椒,蔬菜,62,80,0,0,4,0,1,0
-花椰菜,蔬菜,56,104,1,0,4,0,2,0
-芹菜,蔬菜,53,67,0,0,2,0,1,0
-苦瓜,蔬菜,56,126,5,0,3,0,0,0
-茄子,蔬菜,52,104,0,0,5,0,3,0
-苋菜叶,蔬菜,35,97,2,0,4,0,0,0
-菊苣,蔬菜,64,71,0,0,4,0,3,0
-菜豆,蔬菜,61,280,6,0,13,0,0,0
-菠菜,蔬菜,6,97,2,0,3,0,2,0
-蕨类,蔬菜,64,143,4,0,5,0,0,0
-藜,蔬菜,67,180,4,0,7,0,4,0
-蘑菇,蔬菜,55,141,2,0,6,0,2,0
-西兰花,蔬菜,61,141,2,0,6,0,2,0
-西红柿,蔬菜,65,74,0,0,3,0,1,0
-豆芽,蔬菜,59,510,13,6,9,0,1,0
-豇豆,蔬菜,61,376,2,0,18,0,5,0
-豌豆,豆类及豆制品,63,1435,21,1,62,0,15,0
-辣椒,蔬菜,47,88,0,0,5,0,1,0
-韭菜,蔬菜,38,126,3,0,4,0,2,0
-香菇,蔬菜,56,160,1,0,6,0,3,0
-黄瓜,蔬菜,53,65,0,0,3,0,0,0
-水煮蛋,蛋类,-5,597,12,9,0,0,0,370
-炒蛋,蛋类,-8,621,9,10,1,0,0,277
-煎蛋,蛋类,-9,643,10,11,0,0,0,313
-鸡蛋,蛋类,-4,599,12,9,0,0,0,372
-鸡蛋白,蛋类,5,216,10,0,0,0,0,0
-鸡蛋黄,蛋类,-10,1346,15,26,3,0,0,1085
-鹌鹑蛋,蛋类,-4,663,13,11,0,0,0,844
-利马豆,豆类及豆制品,13,1414,21,0,63,0,19,0
-大豆面粉,豆类及豆制品,7,1816,37,20,31,0,9,0
-嫩豆腐,豆类及豆制品,8,253,7,3,1,0,0,0
-纳豆,豆类及豆制品,8,883,19,11,12,0,5,0
-羽扇豆,豆类及豆制品,14,1554,36,9,40,0,18,0
-老豆腐,豆类及豆制品,9,326,9,4,2,0,0,0
-花生,豆类及豆制品,1,2374,25,49,16,0,8,0
-花生酱,豆类及豆制品,-7,2464,24,49,21,4,8,0
-蚕豆,豆类及豆制品,15,1425,26,1,58,0,25,0
-豆浆,豆类及豆制品,7,226,3,1,6,0,0,0
-鹰嘴豆,豆类及豆制品,8,1581,20,6,62,0,12,0
-黄豆,豆类及豆制品,15,1443,22,2,60,0,25,0

+ 0 - 15
docs/参考资料/CSV/氨基酸评估.csv

@@ -1,15 +0,0 @@
-氨基酸,501999942-某人,530010234-侯,547982403,儿童示例,朱评估报告
-丙氨酸,1,9,19,73,
-丝氨酸,9,88,20,99,75
-异亮氨酸,,,,,66
-甘氨酸,5,38,24,43,33
-组氨酸,40,74,58,73,68
-缬氨酸,2,75,9,91,38
-胱氨酸,86,97,74,92,59
-脯氨酸,1,47,6,82,12
-苏氨酸,,,,,78
-苯丙氨酸,1,38,14,87,85
-蛋氨酸,,,,,56
-谷氨酸,7,27,69,94,67
-赖氨酸,,,,,90
-酪氨酸,47,83,46,60,74

+ 0 - 16
docs/参考资料/CSV/疾病风险评估.csv

@@ -1,16 +0,0 @@
-疾病,501999942-某人,530010234-侯,547982403,儿童示例,朱评估报告
-II型糖尿病,0.21,,0.18,,
-感染性腹泻,0.16,0.41,0.23,0.41,0.34
-抑郁症,0.27,0.36,0.23,0.22,0.25
-炎症性肠炎,0.24,0.28,0.27,0.37,0.26
-甲状腺疾病,0.33,0.12,0.13,0.39,0.06
-结直肠癌,0.26,,0.21,,
-肝病,0.21,,0.12,,
-肠易激综合征,0.18,0.13,0.17,0.17,0.16
-肺部感染或疾病,0.12,,0.17,0.38,0.09
-肺部疾病,,0.13,,,
-肾病,0.05,,0.05,,
-胃病,0.20,,0.21,,
-胆病,0.14,,0.15,,
-自体免疫病,,0.29,,0.29,0.11
-自闭症,,0.10,,0.45,0.09

+ 0 - 10
docs/参考资料/CSV/维生素评估.csv

@@ -1,10 +0,0 @@
-维生素,501999942-某人,530010234-侯,547982403,儿童示例,朱评估报告
-叶酸,35,90,62,13,47
-维生素A,84,74,81,26,54
-维生素B1,2,38,56,77,83
-维生素B12,25,14,31,77,53
-维生素B2,77,32,33,77,53
-维生素B5,64,26,48,78,69
-维生素B6,38,62,58,79,75
-维生素C,31,22,36,60,88
-维生素D,93,16,92,16,90

+ 0 - 119
docs/参考资料/CSV/肠道屏障及代谢物.csv

@@ -1,119 +0,0 @@
-指标,姓名,评估值,健康状况,正常范围,症状
-肠道炎症水平,501999942-某人,16,正常,0-80,
-肠道屏障,501999942-某人,65,正常,15-100,
-脂多糖LPS,501999942-某人,58,正常,0-85,
-次级胆汁酸,501999942-某人,9,不⾜,15-95,
-对甲酚(p-Cresol),501999942-某人,54,正常,0-85,
-吲哚,501999942-某人,9,不⾜,15-90,
-苯酚,501999942-某人,7,正常,0-85,
-腐胺,501999942-某人,4,缺乏,5-85,
-硫化氢,501999942-某人,8,正常,5-85,
-肠道炎症水平,530010234-侯,36,正常,0-80,
-肠道产气,530010234-侯,58,轻度产气,0-50,
-肠道屏障,530010234-侯,49,正常,15-100,
-脂多糖LPS,530010234-侯,53,正常,0-85,
-次级胆汁酸,530010234-侯,48,正常,15-95,
-对甲酚(p-Cresol),530010234-侯,89,过多,0-85,
-吲哚,530010234-侯,56,正常,15-90,
-苯酚,530010234-侯,51,正常,0-85,
-腐胺,530010234-侯,59,正常,5-85,
-硫化氢,530010234-侯,34,正常,5-85,
-尸胺,530010234-侯,38,正常,5-85,
-肠道炎症水平,547982403,8,正常,0-80,
-肠道屏障,547982403,22,正常,15-100,
-脂多糖LPS,547982403,38,正常,0-85,
-次级胆汁酸,547982403,94,正常,15-95,
-对甲酚(p-Cresol),547982403,63,正常,0-85,
-吲哚,547982403,46,正常,15-90,
-苯酚,547982403,12,正常,0-85,
-腐胺,547982403,49,正常,5-85,
-硫化氢,547982403,16,正常,5-85,
-肠道炎症水平,儿童示例,8,正常,0-80,
-肠道产气,儿童示例,89,,0-50,
-肠道屏障,儿童示例,43,正常,15-100,
-脂多糖LPS,儿童示例,2,正常,0-85,
-次级胆汁酸,儿童示例,83,正常,15-95,
-对甲酚(p-Cresol),儿童示例,98,过多,0-85,
-吲哚,儿童示例,49,正常,15-90,
-苯酚,儿童示例,44,正常,0-85,
-腐胺,儿童示例,64,正常,5-85,
-硫化氢,儿童示例,46,正常,5-85,
-尸胺,儿童示例,43,正常,5-85,
-肠道炎症水平,朱评估报告,1,正常0-80腹痛、消化不良、过敏、慢病风,,
-肠道产气,朱评估报告,71,轻度产气0-50腹胀、消化不良/,,
-肠道屏障,朱评估报告,35,正常15-100/过敏、炎症、自身免疫,,
-脂多糖LPS,朱评估报告,7,正常0-85炎症、过敏/,,
-次级胆汁酸,朱评估报告,92,正常15-95胆汁反流、肝脏负担/消化问,,
-对甲酚(p-Cresol),朱评估报告,16,正常0-85尿毒症毒素,慢性肾病,神经行,,
-吲哚,朱评估报告,59,正常15-90食物上瘾,焦虑,慢性肾病,,,
-苯酚,朱评估报告,62,正常0-85结直肠癌,糖尿病肾病,尿毒症,,
-腐胺,朱评估报告,64,正常5-85结直肠癌,IBD,结肠炎,增,,
-硫化氢,朱评估报告,14,正常5-85腹胀气,溃疡性结肠炎,抑制乳,,
-尸胺,朱评估报告,25,正常5-85肠炎,结直肠疾病、乳腺癌/阿,,
-丁酸盐(Butyrate),501999942-某人,14,不⾜,15-95,
-丙酸盐(Propionate),501999942-某人,71,正常,15-90,
-异戊酸盐(Isovaleric),501999942-某人,6,正常,5-85,
-丁酸盐(Butyrate),530010234-侯,31,正常,15-95,
-丙酸盐(Propionate),530010234-侯,79,正常,15-90,
-乙酸盐(Acetate),530010234-侯,17,正常,15-95,
-异戊酸盐(Isovaleric),530010234-侯,12,正常,5-85,
-丁酸盐(Butyrate),547982403,69,正常,15-95,
-丙酸盐(Propionate),547982403,70,正常,15-90,
-异戊酸盐(Isovaleric),547982403,75,正常,5-85,
-丁酸盐(Butyrate),儿童示例,84,正常,15-95,
-丙酸盐(Propionate),儿童示例,33,正常,15-90,
-乙酸盐(Acetate),儿童示例,41,正常,15-95,
-异戊酸盐(Isovaleric),儿童示例,42,正常,5-85,
-丁酸盐(Butyrate),朱评估报告,59,正常15-95肠溃疡,直肠炎/自闭症,焦,,
-丙酸盐(Propionate),朱评估报告,54,正常15-90癫痫、自闭症、糖尿病/肥胖,,
-乙酸盐(Acetate),朱评估报告,64,正常15-95支气管炎、慢性咽炎/菌群紊,,
-异戊酸盐(Isovaleric),朱评估报告,12,正常5-85神经受损、癫痫、体重增长/,,
-γ-氨基丁酸(GABA),501999942-某人,8,不⾜,15-85,
-谷氨酸(Glutamate),501999942-某人,7,不⾜,15-95,
-DOPAC,501999942-某人,19,正常,15-95,
-多巴胺,501999942-某人,94,正常,15-95,
-组胺(Histamine),501999942-某人,67,正常,15-95,
-喹啉(Quinolinic),501999942-某人,5,正常,0-95,
-维生素K2,501999942-某人,75,正常,15-99,
-肌醇(Inositol),501999942-某人,31,正常,15-99,
-血清素(5-HT),530010234-侯,24,正常,15-95,
-γ-氨基丁酸(GABA),530010234-侯,26,正常,15-85,
-谷氨酸(Glutamate),530010234-侯,27,正常,15-95,
-色氨酸(Tryptophan),530010234-侯,48,正常,15-95,
-DOPAC,530010234-侯,41,正常,15-95,
-多巴胺,530010234-侯,98,过多,15-95,
-组胺(Histamine),530010234-侯,91,正常,15-95,
-一氧化氮,530010234-侯,44,正常,15-95,
-喹啉(Quinolinic),530010234-侯,77,正常,0-95,
-维生素K2,530010234-侯,58,正常,15-99,
-肌醇(Inositol),530010234-侯,53,正常,15-99,
-γ-氨基丁酸(GABA),547982403,56,正常,15-85,
-谷氨酸(Glutamate),547982403,69,正常,15-95,
-DOPAC,547982403,58,正常,15-95,
-多巴胺,547982403,85,正常,15-95,
-组胺(Histamine),547982403,46,正常,15-95,
-喹啉(Quinolinic),547982403,27,正常,0-95,
-维生素K2,547982403,49,正常,15-99,
-肌醇(Inositol),547982403,88,正常,15-99,
-血清素(5-HT),儿童示例,10,不足,15-95,
-γ-氨基丁酸(GABA),儿童示例,15,不足,15-85,
-谷氨酸(Glutamate),儿童示例,94,正常,15-95,
-色氨酸(Tryptophan),儿童示例,87,正常,15-95,
-DOPAC,儿童示例,82,正常,15-95,
-多巴胺,儿童示例,72,正常,15-95,
-组胺(Histamine),儿童示例,80,正常,15-95,
-一氧化氮,儿童示例,97,过多,15-95,
-喹啉(Quinolinic),儿童示例,71,正常,0-95,
-维生素K2,儿童示例,13,不足,15-99,
-肌醇(Inositol),儿童示例,14,不足,15-99,
-血清素(5-HT),朱评估报告,22,正常15-95癫痫、心率不齐/焦虑、抑郁,,
-γ-氨基丁酸(GABA),朱评估报告,26,正常15-85肌无力,焦虑症/焦虑、失眠,,
-谷氨酸(Glutamate),朱评估报告,67,正常15-95自闭、精神分裂、多动症、偏,,
-色氨酸(Tryptophan),朱评估报告,70,正常15-95心率过速、神志失常/抑郁、,,
-DOPAC,朱评估报告,84,正常15-95/抑郁,,
-多巴胺,朱评估报告,62,正常15-95精神分裂、上瘾、失眠、偏执,,
-组胺(Histamine),朱评估报告,37,正常15-95抑郁、哮喘、皮疹、消化不良,,
-一氧化氮,朱评估报告,99,过多15-95氧化应激损伤细胞、自身免疫,,
-喹啉(Quinolinic),朱评估报告,42,正常0-95肝病、心率不齐、肾衰/,,
-维生素K2,朱评估报告,10,不足15-99/乳糜泻、溃疡性肠炎,,
-肌醇(Inositol),朱评估报告,79,正常15-99肠胃不适/便秘、银屑病、血,,

+ 0 - 20
docs/参考资料/CSV/菌群_核心菌属.csv

@@ -1,20 +0,0 @@
-菌名,501999942-某人,530010234-侯,547982403,儿童示例,朱评估报告
-0.1914-14.598,,,39%,39%,
-0.3366-3.237,21%,31%,,,
-1.0292-55.9251,,92%,,,
-5.1543-18.1656,59%,45%,,,
-Lachnoclostridium,0.2093,1.7121,1.5483,1.5173,
-⽑螺菌属 Lachnospira,0.1943,,2.3302,,
-优杆菌属 Eubacterium,0.1712,0.2606,1.4728,0.4918,
-双歧杆菌属 Bifidobacterium,0.2396,0.2973,0.1114,0.1141,
-巨单胞菌属 Megamonas,ND,0.1404,0.0169,ND,
-拟杆菌属 Bacteroides,13.2781,58.0864,45.0500,18.4336,
-普雷沃⽒菌属 Prevotella,60.0857,,4.2684,,
-普雷沃氏菌属 Prevotella,,0.4876,,0.6430,
-梭菌属 Clostridium,0.2787,0.1303,1.1836,0.6731,
-毛螺菌属 Lachnospira,,0.2574,,2.6397,
-瘤胃球菌属 Ruminococcus,1.6504,0.5747,1.9927,2.1607,
-粪杆菌属 Faecalibacterium,3.2406,1.8959,7.1088,14.2451,
-粪球菌属 Coprococcus,1.8668,0.0501,0.2561,1.4292,
-经黏液真杆菌属 Blautia,0.1206,0.1869,0.5625,3.1770,
-考拉杆菌属 Phascolarctobacterium,0.0101,0.0167,4.4324,1.4663,

+ 0 - 636
docs/参考资料/extract_full_report.old.py

@@ -1,636 +0,0 @@
-"""
-肠道菌群健康检测报告 — 全指标提取脚本
-====================================
-提取5份PDF中所有结构化指标,输出:
-  - docs/参考资料/CSV/ 目录下各模块汇总CSV
-
-用法:python extract_full_report.py
-
-依赖:pip install PyPDF2
-"""
-
-import sys, os, csv, re
-sys.stdout.reconfigure(encoding='utf-8')
-sys.stderr.reconfigure(encoding='utf-8')
-from PyPDF2 import PdfReader
-
-BASE = r'D:\workspace\cfc\docs\参考资料'
-OUTDIR = os.path.join(BASE, 'CSV')
-os.makedirs(OUTDIR, exist_ok=True)
-
-# ── CJK Radical → 标准汉字 ──
-RADICAL_MAP = {
-    '\u2f18': '卜', '\u2f1f': '土', '\u2f24': '大', '\u2f26': '子',
-    '\u2f29': '小', '\u2f2d': '山', '\u2f32': '干', '\u2f3c': '心',
-    '\u2f42': '文', '\u2f46': '无', '\u2f4a': '木', '\u2f50': '比',
-    '\u2f54': '水', '\u2f55': '火', '\u2f5c': '牛', '\u2f5f': '玉',
-    '\u2f60': '瓜', '\u2f62': '甘', '\u2f63': '生', '\u2f64': '用',
-    '\u2f69': '白', '\u2f6a': '皮', '\u2f6c': '目', '\u2f6f': '石',
-    '\u2f75': '竹', '\u2f76': '米', '\u2f7a': '羊', '\u2f7b': '羽',
-    '\u2f7c': '老', '\u2f7f': '耳', '\u2f81': '肉', '\u2f90': '衣',
-    '\u2f95': '谷', '\u2f96': '豆', '\u2f9d': '身', '\u2fa6': '金',
-    '\u2faf': '面', '\u2fb2': '韭', '\u2fb9': '香', '\u2fca': '黑',
-    '\u2ec9': '贝', '\u2edd': '食', '\u2ee2': '马', '\u2ee5': '鱼',
-    '\u2ee8': '麦', '\u2ee9': '黄', '\u2ef0': '龙',
-}
-
-COLUMNS_FOOD = ['名称', '分类', '推荐指数', '能量KJ', '蛋白g', '脂肪g',
-                '碳水化合物g', '淀粉g', '总膳食纤维g', '胆固醇mg']
-KNOWN_CATS = [
-    '主食', '乳制品', '干果', '坚果', '快餐', '水产品',
-    '水果', '汤', '肉类', '蔬菜', '豆类及豆制品', '蛋类', '饮料'
-]
-
-def norm(s):
-    return ''.join(RADICAL_MAP.get(c, c) for c in s)
-
-# ============================
-# 模块1:基本信息 + 概要指标
-# ============================
-def extract_overview(label, pages_text):
-    """从p0提取基本信息 + 核心指标"""
-    t = norm(pages_text[0])
-    r = {'姓名': label}
-
-    m = re.search(r'编号\s*(\S+)', t)
-    if m: r['编号'] = m.group(1)
-    m = re.search(r'姓名\s*(\S+)', t)
-    if m: r['姓名'] = m.group(1)
-
-    for pat in ['年龄', '性别', '肠道预测年龄', '肠型']:
-        m = re.search(f'{pat}[:\s]*(\S+)', t)
-        if m: r[pat] = m.group(1)
-
-    # 核心指标(同一行或附近行)
-    for kw in ['肠道菌群平衡', '菌群多样性', '有益菌', '有害菌', '核心菌属']:
-        m = re.search(f'{kw}[:\s]*(\d+)', t)
-        if m: r[kw] = m.group(1)
-
-    # 健康总分可能不在p0
-    for pt in pages_text:
-        if '健康总分' in norm(pt):
-            m = re.search(r'健康总分.*?(\d+)', norm(pt), re.DOTALL)
-            if m:
-                r['健康总分'] = m.group(1)
-                break
-
-    # 疾病风险评估概览(第一行风险描述)
-    for pt in pages_text:
-        t2 = norm(pt)
-        if '个别疾病高风险' in t2 or '个别疾病高风' in t2:
-            m = re.search(r'(\S*高风险或\S*)', t2)
-            if m: r['风险评估结论'] = m.group(1)
-            break
-
-    return r
-
-
-# ============================
-# 模块2:表格类指标(通用)
-# ============================
-def extract_table(pages_text, header_marker, name_col=0, val_col=1, range_col=None):
-    """
-    通用表格提取器。
-    header_marker: 表格开始的标题关键词
-    返回 [{指标名称, 评估值, 评估结论?, 正常范围?}]
-    """
-    rows = []
-    found = False
-    for pt in pages_text:
-        t = norm(pt)
-        if header_marker in t:
-            found = True
-            lines = t.split('\n')
-            started = False
-            col_headers = [h.strip() for h in lines if h.strip() in ['指标范围', '指标', '名称', '评估值', '评估', '正常范围', '丰度']]
-            for line in lines:
-                ls = line.strip()
-                if not ls or ls in ['指标范围']:
-                    continue
-                # Detect data rows: 指标名 + 数字 + 可选范围/结论
-                parts = ls.split()
-                if len(parts) >= 2:
-                    # Try to parse as indicator + value + (optional status/range)
-                    name_part = parts[0]
-                    val_candidate = parts[1]
-                    # Also check if it's a new section header
-                    if any(name_part.startswith(h) for h in ['一、', '二、', '三、', '四、', '五、']):
-                        continue
-                    if re.match(r'^-?\d+\.?\d*$', val_candidate):
-                        row = {'指标名称': name_part, '评估值': val_candidate}
-                        if len(parts) >= 3:
-                            row['评估结论'] = parts[2]
-                        if len(parts) >= 4:
-                            row['正常范围'] = parts[3]
-                        rows.append(row)
-        elif found:
-            break  # Stop after first page containing the table
-    return rows
-
-
-def extract_nutrition_tables(pages_text):
-    """
-    从营养状况评估页面提取 主要营养评估/氨基酸/维生素/微量元素 表格。
-    返回 {模块名: [{指标, 评估值, 状态}]}
-    """
-    results = {}
-    current_section = None
-    # 找到包含营养状况评估的页面
-    for pt in pages_text:
-        t = norm(pt)
-        lines = [l.strip() for l in t.split('\n') if l.strip()]
-        
-        for line in lines:
-            # Section headers
-            if '主要营养评估' in line:
-                current_section = '主要营养评估'
-                results.setdefault(current_section, [])
-                continue
-            elif '氨基酸评估' in line or '氨基酸评' in line:
-                current_section = '氨基酸评估'
-                results.setdefault(current_section, [])
-                continue
-            elif '维生素评估' in line or '维生素评' in line:
-                current_section = '维生素评估'
-                results.setdefault(current_section, [])
-                continue
-            elif '微量元素评估' in line:
-                current_section = '微量元素评估'
-                results.setdefault(current_section, [])
-                continue
-            elif line in ['营养状况评估']:
-                current_section = '营养状况评估'
-                results.setdefault(current_section, [])
-                continue
-            
-            if not current_section:
-                continue
-            
-            # Parse data rows: 指标名 + 数值 + (状态)
-            parts = line.split()
-            if len(parts) >= 2:
-                name = parts[0]
-                if re.match(r'^-?\d+\.?\d*$', parts[1]):
-                    row = {'指标': name, '评估值': parts[1]}
-                    if len(parts) >= 3:
-                        row['状态'] = parts[2]
-                    if current_section:
-                        results[current_section].append(row)
-    
-    return results
-
-
-# ============================
-# 模块3:疾病风险评估
-# ============================
-def extract_disease_risk(pages_text):
-    """
-    提取疾病风险评估表格。
-    格式:疾病名 + 风险值 + 风险等级
-    """
-    found = False
-    rows = []
-    for pt in pages_text:
-        t = norm(pt)
-        if '疾病风险评估' in t:
-            found = True
-            continue
-        if found:
-            lines = [l.strip() for l in t.split('\n') if l.strip() and l.strip() not in ['指标范围']]
-            for line in lines:
-                if line in ['疾病风险评估']:
-                    continue
-                parts = line.split()
-                if len(parts) >= 2:
-                    name = parts[0]
-                    if re.match(r'^0\.\d+$', parts[1]):
-                        row = {'疾病': name, '风险值': parts[1]}
-                        if len(parts) >= 3:
-                            row['风险等级'] = parts[2]
-                        rows.append(row)
-            # Keep parsing until next major section
-            if any(k in t for k in ['营养状况评估', '主要消化道', '抗生素']):
-                break
-    return rows
-
-
-# ============================
-# 模块4:致病菌 + 肠道屏障 + 短链脂肪酸
-# ============================
-def extract_pathogens(pages_text):
-    rows = []
-    found = False
-    for pt in pages_text:
-        t = norm(pt)
-        if '主要消化道致病菌' in t:
-            found = True
-            continue
-        if found:
-            lines = [l.strip() for l in t.split('\n') if l.strip()]
-            for line in lines:
-                if '肠道屏障' in line or '抗生素' in line:
-                    return rows
-                parts = line.split()
-                if len(parts) >= 2:
-                    name = parts[0]
-                    if re.match(r'^\d+%?$', parts[1]):
-                        row = {'致病菌': name, '丰度': parts[1]}
-                        if len(parts) >= 3:
-                            row['评估'] = parts[2]
-                        rows.append(row)
-    return rows
-
-
-def extract_barrier(pages_text):
-    """肠道炎症水平"""
-    found = False
-    for pt in pages_text:
-        t = norm(pt)
-        if '肠道炎症水平' in t:
-            m = re.search(r'肠道炎症水平\s*(\d+)', t)
-            if m:
-                return {'肠道炎症水平': m.group(1)}
-    return {}
-
-
-def extract_scfa(pages_text):
-    """短链脂肪酸"""
-    rows = []
-    found = False
-    for pt in pages_text:
-        t = norm(pt)
-        if '短链脂肪' in t:
-            found = True
-            continue
-        if found:
-            lines = [l.strip() for l in t.split('\n') if l.strip()]
-            for line in lines:
-                if '抗生素' in line:
-                    return rows
-                parts = line.split()
-                if len(parts) >= 2 and '酸' in parts[0] and re.match(r'^\d+$', parts[1]):
-                    row = {'短链脂肪酸': parts[0], '评估值': parts[1]}
-                    if len(parts) >= 3:
-                        row['正常范围'] = parts[2]
-                    if len(parts) >= 4:
-                        row['症状'] = ' '.join(parts[3:])
-                    rows.append(row)
-    return rows
-
-
-def extract_antibiotic_risk(pages_text):
-    """抗生素风险评估"""
-    rows = []
-    found = False
-    for pt in pages_text:
-        t = norm(pt)
-        if '抗生素风险' in t:
-            found = True
-            continue
-        if found:
-            lines = [l.strip() for l in t.split('\n') if l.strip() and l.strip() != '指标范围']
-            for line in lines:
-                if '抗生素风险' in line:
-                    continue
-                parts = line.split()
-                if len(parts) >= 2:
-                    name = parts[0]
-                    if re.match(r'^\d+$', parts[1]):
-                        row = {'抗生素': name, '风险值': parts[1]}
-                        if len(parts) >= 3:
-                            row['评级'] = '正常' if parts[2] == '正常' else ('偏低' if '偏低' in parts[2] else parts[2])
-                        rows.append(row)
-            if '一、' in t or '二、' in t or len(rows) > 15:
-                break
-    return rows
-
-
-# ============================
-# 个体化食物推荐表(复用已有逻辑)
-# ============================
-FOOD_SKIP_TEXTS = [
-    '根据您的肠道菌群', '分值从-100', '食物推荐考虑', '食物推荐是综合',
-    '需要注意的是', '本饮食推荐', '该饮食推荐根据', '后续表格中的营养',
-    '16S 高通量测序', '基于机器学习和', '肠道菌群健康检测报告说明',
-    '检测方法及局限性', '数据分析及模型', '结果解读及使用',
-    '影响因素说明', '建议将检测结果', '营养建议说明',
-    '重要提示', '推荐食物清单', '实际食用时需结合', '如有特殊疾病',
-    '免责声明', '本检测报告仅供', '以上模型预测', '正常范围的定义',
-]
-
-def split_7_fields(s):
-    results = []
-    ranges = [(2, 4), (1, 2), (1, 2), (1, 2), (1, 2), (1, 2), (1, 4)]
-    def backtrack(pos, idx, nums):
-        if idx == 7:
-            if pos == len(s):
-                results.append(list(nums))
-            return
-        if pos >= len(s): return
-        lo, hi = ranges[idx]
-        for w in range(lo, min(hi + 1, len(s) - pos + 1)):
-            chunk = s[pos:pos + w]
-            if chunk.isdigit():
-                backtrack(pos + w, idx + 1, nums + [int(chunk)])
-    backtrack(0, 0, [])
-    return results
-
-def decode_compressed(name, num_str, ref_vals=None):
-    raw = num_str.lstrip('-')
-    has_neg = num_str.startswith('-')
-    results = []
-    for rec_len in range(1, 3):
-        if rec_len > len(raw): continue
-        rec = ('-' if has_neg else '') + raw[:rec_len]
-        try:
-            rec_val = int(rec)
-            if not (-100 <= rec_val <= 100): continue
-        except: continue
-        remain = raw[rec_len:]
-        candidates = split_7_fields(remain)
-        for nums in candidates:
-            if ref_vals:
-                matches = sum(1 for i in range(7) if ref_vals[i] == nums[i])
-                if matches >= 6:
-                    results.append([rec_val] + nums)
-            else:
-                results.append([rec_val] + nums)
-    if not results: return None
-    if ref_vals:
-        results.sort(key=lambda r: (sum(1 for i in range(7) if ref_vals[i] == r[1:][i]),
-                                    -len(str(abs(r[0])))), reverse=True)
-        if sum(1 for i in range(7) if ref_vals[i] == results[0][1:][i]) < 6: return None
-    return results[0]
-
-def extract_food_table(pdf_path, ref_lookup=None):
-    reader = PdfReader(pdf_path)
-    food_start = None
-    for i, page in enumerate(reader.pages):
-        if '个体化食物推荐表' in page.extract_text():
-            food_start = i
-            break
-    if food_start is None:
-        return [], 'not_found'
-
-    first_text = norm(reader.pages[food_start + 1].extract_text())
-    lines = [l.strip() for l in first_text.split('\n') if l.strip() and not re.match(r'\d+/\d+', l)]
-    is_compressed = (len(lines) <= 3 and len(lines[0]) > 200) or sum(1 for l in lines[:10] if len(l) > 100) >= 3
-
-    rows = []
-    if is_compressed:
-        fmt = 'compressed'
-        for i in range(food_start + 1, len(reader.pages)):
-            text = norm(reader.pages[i].extract_text())
-            text = re.sub(r'\d+/\d+', '', text)
-            # Remove header
-            header = '名称分类推荐指数能量KJ蛋白g脂肪g碳水化合物g淀粉g总膳食纤维g胆固醇mg'
-            text = text.replace(header, '')
-            for kw in FOOD_SKIP_TEXTS:
-                text = text.replace(kw, '')
-            while text:
-                best_cat, best_idx = None, len(text)
-                for cat in KNOWN_CATS:
-                    idx = text.find(cat)
-                    if idx != -1 and idx < best_idx:
-                        best_idx, best_cat = idx, cat
-                if best_cat is None: break
-                name = text[:best_idx]
-                text = text[best_idx + len(best_cat):]
-                num_str = ''
-                while text and (text[0].isdigit() or text[0] in '-\u2212\u2014'):
-                    c = '-' if text[0] in '\u2212\u2014' else text[0]
-                    num_str += c
-                    text = text[1:]
-                if not name or not num_str: continue
-                ref_vals = ref_lookup.get(name) if ref_lookup else None
-                decoded = decode_compressed(name, num_str, ref_vals)
-                if decoded:
-                    rows.append(dict(zip(COLUMNS_FOOD, [name, best_cat] + [str(v) for v in decoded])))
-    else:
-        fmt = 'vertical'
-        all_lines = []
-        for i in range(food_start + 1, len(reader.pages)):
-            for line in norm(reader.pages[i].extract_text()).split('\n'):
-                lt = line.strip()
-                if not lt or re.match(r'\d+/\d+', lt) or lt in COLUMNS_FOOD: continue
-                if len(lt) > 60 and any(k in lt for k in FOOD_SKIP_TEXTS): continue
-                all_lines.append(lt)
-        i = 0
-        while i + 9 < len(all_lines):
-            name = all_lines[i].strip()
-            cat = all_lines[i + 1].strip()
-            if cat not in KNOWN_CATS: i += 1; continue
-            nums = []
-            ok = True
-            for j in range(2, 10):
-                v = all_lines[i + j].replace('\u2212', '-').replace('\u2014', '-').strip()
-                try: int(v); nums.append(v)
-                except: ok = False; break
-            if ok and len(nums) == 8:
-                rows.append(dict(zip(COLUMNS_FOOD, [name, cat] + nums)))
-            i += 1
-
-    return rows, fmt
-
-
-# ============================
-# 主流程
-# ============================
-def main():
-    pdf_files = sorted(f for f in os.listdir(BASE) if f.lower().endswith('.pdf'))
-    if not pdf_files:
-        print('未找到PDF文件')
-        return
-
-    # ── 加载所有PDF文本(只做一次) ──
-    all_data = {}  # label -> {pages_text, overview, ...}
-    print('读取PDF文件...')
-    for pdf_file in pdf_files:
-        pdf_path = os.path.join(BASE, pdf_file)
-        label = pdf_file.replace('.pdf', '')
-        try:
-            reader = PdfReader(pdf_path)
-            pages_text = [p.extract_text() for p in reader.pages]
-            all_data[label] = {'reader': reader, 'pages_text': pages_text}
-            print(f'  {label}: {len(pages_text)} pages')
-        except Exception as e:
-            print(f'  {label}: ERROR - {e}')
-
-    if not all_data:
-        print('无可处理的PDF')
-        return
-
-    # ── 1. 报告概述 ──
-    print('\n[1/11] 报告概述...')
-    overviews = []
-    for label in all_data:
-        r = extract_overview(label, all_data[label]['pages_text'])
-        overviews.append(r)
-    overview_cols = set()
-    for r in overviews:
-        overview_cols.update(r.keys())
-    overview_cols = sorted(overview_cols)
-    with open(os.path.join(OUTDIR, '报告概述.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-        w = csv.DictWriter(f, fieldnames=overview_cols)
-        w.writeheader()
-        w.writerows(overviews)
-    print(f'  -> CSV/报告概述.csv ({len(overviews)} 行)')
-
-    # ── 2. 疾病风险评估 ──
-    print('[2/11] 疾病风险评估...')
-    disease_data = {}  # 疾病名 -> {label: 风险值}
-    for label, d in all_data.items():
-        rows = extract_disease_risk(d['pages_text'])
-        for r in rows:
-            disease_data.setdefault(r['疾病'], {})[label] = r['风险值']
-    if disease_data:
-        labels = list(all_data.keys())
-        with open(os.path.join(OUTDIR, '疾病风险评估.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-            w = csv.DictWriter(f, fieldnames=['疾病'] + labels)
-            w.writeheader()
-            for disease, vals in sorted(disease_data.items()):
-                row = {'疾病': disease}
-                row.update(vals)
-                w.writerow(row)
-        print(f'  -> CSV/疾病风险评估.csv ({len(disease_data)} 指标 × {len(labels)} 人)')
-
-    # ── 3-6. 营养相关评估 ──
-    nutrition_sections = ['营养状况评估', '主要营养评估', '氨基酸评估', '维生素评估', '微量元素评估']
-    for sec in nutrition_sections:
-        print(f'[3-6/11] {sec}...')
-        sec_data = {}
-        for label, d in all_data.items():
-            tables = extract_nutrition_tables(d['pages_text'])
-            for item in tables.get(sec, []):
-                sec_data.setdefault(item['指标'], {})[label] = item.get('状态', item.get('评估值', ''))
-        if sec_data:
-            labels = list(all_data.keys())
-            fname = f'{sec}.csv'
-            with open(os.path.join(OUTDIR, fname), 'w', newline='', encoding='utf-8-sig') as f:
-                w = csv.DictWriter(f, fieldnames=['指标'] + labels)
-                w.writeheader()
-                for name, vals in sorted(sec_data.items()):
-                    row = {'指标': name}
-                    row.update(vals)
-                    w.writerow(row)
-            print(f'  -> CSV/{fname} ({len(sec_data)} 指标)')
-
-    # ── 7. 主要消化道致病菌 ──
-    print('[7/11] 主要消化道致病菌...')
-    path_data = {}
-    for label, d in all_data.items():
-        rows = extract_pathogens(d['pages_text'])
-        for r in rows:
-            path_data.setdefault(r['致病菌'], {})[label] = r['丰度']
-    if path_data:
-        labels = list(all_data.keys())
-        with open(os.path.join(OUTDIR, '主要消化道致病菌.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-            w = csv.DictWriter(f, fieldnames=['致病菌'] + labels)
-            w.writeheader()
-            for name, vals in sorted(path_data.items()):
-                row = {'致病菌': name}
-                row.update(vals)
-                w.writerow(row)
-        print(f'  -> CSV/主要消化道致病菌.csv ({len(path_data)} 菌种)')
-
-    # ── 8. 肠道炎症水平 ──
-    print('[8/11] 肠道屏障及代谢物...')
-    barrier_rows = []
-    for label, d in all_data.items():
-        b = extract_barrier(d['pages_text'])
-        if b:
-            barrier_rows.append({'指标': '肠道炎症水平', '姓名': label, '评估值': b['肠道炎症水平']})
-    # 短链脂肪酸
-    for label, d in all_data.items():
-        rows = extract_scfa(d['pages_text'])
-        for r in rows:
-            barrier_rows.append({'指标': r['短链脂肪酸'], '姓名': label, '评估值': r['评估值'],
-                                 '正常范围': r.get('正常范围', ''), '症状': r.get('症状', '')})
-    if barrier_rows:
-        with open(os.path.join(OUTDIR, '肠道屏障及代谢物.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-            w = csv.DictWriter(f, fieldnames=['指标', '姓名', '评估值', '正常范围', '症状'])
-            w.writeheader()
-            w.writerows(barrier_rows)
-        print(f'  -> CSV/肠道屏障及代谢物.csv ({len(barrier_rows)} 条)')
-
-    # ── 9. 抗生素风险评估 ──
-    print('[9/11] 抗生素风险评估...')
-    abx_data = {}
-    for label, d in all_data.items():
-        rows = extract_antibiotic_risk(d['pages_text'])
-        for r in rows:
-            abx_data.setdefault(r['抗生素'], {})[label] = r['风险值']
-    if abx_data:
-        labels = list(all_data.keys())
-        with open(os.path.join(OUTDIR, '抗生素风险评估.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-            w = csv.DictWriter(f, fieldnames=['抗生素'] + labels)
-            w.writeheader()
-            for name, vals in sorted(abx_data.items()):
-                row = {'抗生素': name}
-                row.update(vals)
-                w.writerow(row)
-        print(f'  -> CSV/抗生素风险评估.csv ({len(abx_data)} 种抗生素)')
-
-    # ── 10. 个体化食物推荐表 ──
-    print('[10/11] 个体化食物推荐表...')
-
-    # 先用侯报告建立标准营养参考(用于压缩格式解码)
-    ref_nutrition = {}
-    for label in all_data:
-        if '侯' in label:
-            pdf_path = os.path.join(BASE, label + '.pdf')
-            ref_rows, _ = extract_food_table(pdf_path)
-            for r in ref_rows:
-                ref_nutrition[r['名称']] = [int(r[k]) for k in
-                    ['能量KJ', '蛋白g', '脂肪g', '碳水化合物g', '淀粉g', '总膳食纤维g', '胆固醇mg']]
-            break
-
-    for label, d in all_data.items():
-        pdf_path = os.path.join(BASE, label + '.pdf')
-        rows, fmt = extract_food_table(pdf_path, ref_nutrition)
-        fname = f'{label}-个体化食物推荐表.csv'
-        with open(os.path.join(OUTDIR, fname), 'w', newline='', encoding='utf-8-sig') as f:
-            w = csv.DictWriter(f, fieldnames=COLUMNS_FOOD)
-            w.writeheader()
-            w.writerows(rows)
-        print(f'  -> CSV/{fname} ({len(rows)} 条, {fmt})')
-
-    # ── 11. 推荐指数汇总 ──
-    print('[11/11] 推荐指数汇总...')
-    # 收集各报告的推荐指数
-    rec_all = {}
-    for label in all_data:
-        pdf_path = os.path.join(BASE, label + '.pdf')
-        rows, _ = extract_food_table(pdf_path, ref_nutrition)
-        rec_all[label] = {}
-        for r in rows:
-            rec_all[label][r['名称']] = r['推荐指数']
-
-    # 标准营养参考(优先侯)
-    std_label = next((l for l in all_data if '侯' in l), list(all_data.keys())[0])
-    pdf_path = os.path.join(BASE, std_label + '.pdf')
-    std_rows, _ = extract_food_table(pdf_path)
-
-    labels = list(all_data.keys())
-    sum_cols = ['名称', '分类'] + ['能量KJ', '蛋白g', '脂肪g', '碳水化合物g', '淀粉g', '总膳食纤维g', '胆固醇mg'] + labels
-    with open(os.path.join(OUTDIR, '推荐指数汇总.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-        w = csv.DictWriter(f, fieldnames=sum_cols)
-        w.writeheader()
-        for r in std_rows:
-            name = r['名称']
-            row = {'名称': name, '分类': r['分类']}
-            for k in ['能量KJ', '蛋白g', '脂肪g', '碳水化合物g', '淀粉g', '总膳食纤维g', '胆固醇mg']:
-                row[k] = r[k]
-            for la in labels:
-                row[la] = rec_all.get(la, {}).get(name, '')
-            w.writerow(row)
-    print(f'  -> CSV/推荐指数汇总.csv ({len(std_rows)} 行)')
-    for la in labels:
-        missing = sum(1 for r in std_rows if not rec_all.get(la, {}).get(r['名称'], ''))
-        print(f'    {la}: {"完整" if missing == 0 else f"缺失 {missing} 条"}')
-
-    print(f'\n完成!所有CSV已输出到 {OUTDIR}/')
-
-
-if __name__ == '__main__':
-    main()

+ 0 - 668
docs/参考资料/extract_full_report.py

@@ -1,668 +0,0 @@
-"""
-肠道菌群健康检测报告 — 全指标提取脚本(v3)
-========================================
-支持两种PDF文本格式:
-  - 三元组逐行格式(某人、侯、547982403、儿童示例)
-  - 压缩同行格式(朱评估报告)
-
-输出到 docs/参考资料/CSV/ 目录
-
-用法:python extract_full_report.py
-"""
-
-import sys, os, csv, re
-sys.stdout.reconfigure(encoding='utf-8')
-sys.stderr.reconfigure(encoding='utf-8')
-from PyPDF2 import PdfReader
-
-BASE = r'D:\workspace\cfc\docs\参考资料'
-OUTDIR = os.path.join(BASE, 'CSV')
-os.makedirs(OUTDIR, exist_ok=True)
-
-RADICAL_MAP = {
-    '\u2f18': '卜', '\u2f1f': '土', '\u2f24': '大', '\u2f26': '子',
-    '\u2f29': '小', '\u2f2d': '山', '\u2f32': '干', '\u2f3c': '心',
-    '\u2f42': '文', '\u2f46': '无', '\u2f4a': '木', '\u2f50': '比',
-    '\u2f54': '水', '\u2f55': '火', '\u2f5c': '牛', '\u2f5f': '玉',
-    '\u2f60': '瓜', '\u2f62': '甘', '\u2f63': '生', '\u2f64': '用',
-    '\u2f69': '白', '\u2f6a': '皮', '\u2f6c': '目', '\u2f6f': '石',
-    '\u2f75': '竹', '\u2f76': '米', '\u2f7a': '羊', '\u2f7b': '羽',
-    '\u2f7c': '老', '\u2f7f': '耳', '\u2f81': '肉', '\u2f90': '衣',
-    '\u2f95': '谷', '\u2f96': '豆', '\u2f9d': '身', '\u2fa6': '金',
-    '\u2faf': '面', '\u2fb2': '韭', '\u2fb9': '香', '\u2fca': '黑',
-    '\u2ec9': '贝', '\u2edd': '食', '\u2ee2': '马', '\u2ee5': '鱼',
-    '\u2ee8': '麦', '\u2ee9': '黄', '\u2ef0': '龙',
-}
-
-COLUMNS_FOOD = ['名称', '分类', '推荐指数', '能量KJ', '蛋白g', '脂肪g',
-                '碳水化合物g', '淀粉g', '总膳食纤维g', '胆固醇mg']
-KNOWN_CATS = ['主食', '乳制品', '干果', '坚果', '快餐', '水产品',
-              '水果', '汤', '肉类', '蔬菜', '豆类及豆制品', '蛋类', '饮料']
-FOOD_SKIP_TEXTS = [
-    '根据您的肠道菌群', '分值从-100', '食物推荐考虑', '食物推荐是综合',
-    '需要注意的是', '本饮食推荐', '该饮食推荐根据', '后续表格中的营养',
-    '16S 高通量测序', '基于机器学习和', '肠道菌群健康检测报告说明',
-    '检测方法及局限性', '数据分析及模型', '结果解读及使用',
-    '影响因素说明', '建议将检测结果', '营养建议说明',
-    '重要提示', '推荐食物清单', '实际食用时需结合', '如有特殊疾病',
-    '免责声明', '本检测报告仅供', '以上模型预测', '正常范围的定义',
-    '募极生物',
-]
-
-def norm(s):
-    return ''.join(RADICAL_MAP.get(c, c) for c in s)
-
-
-def clean_lines(text):
-    lines = []
-    for line in norm(text).split('\n'):
-        ls = line.strip()
-        if not ls or re.match(r'^\d+/\d+$', ls):
-            continue
-        lines.append(ls)
-    return lines
-
-
-def detect_format(pages_text):
-    """检测报告格式:'triplet'(逐行) 或 'inline'(压缩同行)"""
-    for pt in pages_text:
-        t = norm(pt)
-        if '疾病风险评估' in t and '指标范围' in t:
-            lines = t.split('\n')
-            for line in lines:
-                ls = line.strip()
-                if not ls: continue
-                if re.search(r'[\u4e00-\u9fff]+\d+\.\d+[\u4e00-\u9fff]+', ls):
-                    return 'inline'
-            return 'triplet'
-    return 'triplet'
-
-
-# =====================================================
-# 格式1:三元组逐行
-# =====================================================
-def extract_triplet_module(lines, end_markers=None):
-    results = []
-    i = 0
-    while i < len(lines):
-        if end_markers:
-            if any(lines[i] == em or lines[i].startswith(em) for em in end_markers):
-                break
-        if lines[i] == '指标范围':
-            i += 1
-            continue
-        name = lines[i]
-        if i + 2 >= len(lines):
-            break
-        val = lines[i + 1]
-        status = lines[i + 2]
-        if re.match(r'^-?\d+\.?\d*$', val):
-            results.append({'名称': name, '数值': val, '状态': status})
-            i += 3
-        else:
-            i += 1
-    return results
-
-
-def extract_pathogens_triplet(lines):
-    results = []
-    i = 0
-    found = False
-    while i < len(lines):
-        if lines[i] == '主要消化道致病菌':
-            found = True
-            i += 1
-            continue
-        if not found:
-            i += 1
-            continue
-        if lines[i] in ['肠道屏障及菌群代谢物', '肠道屏障', '抗生素风险', '短链脂肪酸']:
-            break
-        if lines[i] in ['致病菌', '丰度', '评估']:
-            i += 1
-            continue
-        name = lines[i]
-        if i + 2 < len(lines) and re.match(r'^\d+%$', lines[i+1]):
-            results.append({'致病菌': name, '丰度': lines[i+1], '评估': lines[i+2]})
-            i += 3
-        else:
-            i += 1
-    return results
-
-
-# =====================================================
-# 格式2:压缩同行
-# =====================================================
-def extract_inline_module(text):
-    results = []
-    pattern = r'([\u4e00-\u9fff()\u2014-]+?)(\d+(?:\.\d+)?)([\u4e00-\u9fff/]+)'
-    for m in re.finditer(pattern, text):
-        name = m.group(1).strip()
-        val = m.group(2)
-        status = m.group(3).strip()
-        if any(k in name for k in ['指标范围', '疾病风险', '营养状况', '抗生素风险',
-                                      '注:', '注:', '页']):
-            continue
-        if any(k in status for k in ['指标范围', '疾病风险']):
-            continue
-        try:
-            fv = float(val)
-            if fv >= 0 and fv <= 1000:
-                results.append({'名称': name, '数值': val, '状态': status})
-        except:
-            pass
-    return results
-
-
-def extract_pathogens_inline(text):
-    results = []
-    pattern = r'([\u4e00-\u9fff]+?)(\d+%)([\u4e00-\u9fff]+)'
-    for m in re.finditer(pattern, text):
-        name = m.group(1).strip()
-        val = m.group(2)
-        status = m.group(3).strip()
-        if name in ['主要消化道', '肠道屏障']:
-            continue
-        results.append({'致病菌': name, '丰度': val, '评估': status})
-    return results
-
-
-def extract_barrier_inline(text):
-    results = {}
-    pattern = r'([\u4e00-\u9fff()\u2014-]+?)(\d+)\s*(正常|轻度产气|过多|过低)\s*(\d+-\d+)\s*([\u4e00-\u9fff、,。/\s]+?)(?=[\u4e00-\u9fff()\u2014-]+\d+\s*|$)'
-    for m in re.finditer(pattern, text):
-        name = m.group(1).strip()
-        val = m.group(2)
-        status = m.group(3)
-        rng = m.group(4)
-        symptoms = m.group(5).strip()
-        if '肠道屏障' in name or '菌群代谢物' in name:
-            continue
-        if name not in results:
-            results[name] = {
-                '名称': name, '评估值': val, '健康状况': status,
-                '正常范围': rng, '症状': symptoms
-            }
-    return results
-
-
-# =====================================================
-# 报告概述
-# =====================================================
-def extract_overview(lines_all, label):
-    r = {'姓名': label}
-    t = '\n'.join(lines_all)
-
-    m = re.search(r'编号\s*(\S+)', t)
-    if m: r['编号'] = m.group(1)
-    m = re.search(r'姓名\s*(\S+)', t)
-    if m: r['姓名'] = m.group(1)
-    for pat in ['年龄', '性别']:
-        m = re.search(rf'{pat}\s*(\S+)', t)
-        if m: r[pat] = m.group(1)
-    m = re.search(r'肠道预测年龄[:\s]*([\d.]+岁?)', t)
-    if m: r['肠道预测年龄'] = m.group(1)
-    m = re.search(r'肠型[:\s]*(\S+)', t)
-    if m: r['肠型'] = m.group(1)
-    for kw in ['肠道菌群平衡', '菌群多样性', '有益菌', '有害菌', '核心菌属']:
-        m = re.search(rf'{kw}\s*(\d+)', t)
-        if m: r[kw] = m.group(1)
-    m = re.search(r'健康总分\s*(\d+)', t)
-    if m: r['健康总分'] = m.group(1)
-    for kw in ['菌群健康', '慢病控制', '营养均衡']:
-        m = re.search(rf'{kw}\s*(\d+)', t)
-        if m: r[kw] = m.group(1)
-    return r
-
-
-# =====================================================
-# 食物推荐表
-# =====================================================
-def split_7_fields(s):
-    results = []
-    ranges = [(2, 4), (1, 2), (1, 2), (1, 2), (1, 2), (1, 2), (1, 4)]
-    def backtrack(pos, idx, nums):
-        if idx == 7:
-            if pos == len(s):
-                results.append(list(nums))
-            return
-        if pos >= len(s): return
-        lo, hi = ranges[idx]
-        for w in range(lo, min(hi + 1, len(s) - pos + 1)):
-            chunk = s[pos:pos + w]
-            if chunk.isdigit():
-                backtrack(pos + w, idx + 1, nums + [int(chunk)])
-    backtrack(0, 0, [])
-    return results
-
-def decode_compressed(name, num_str, ref_vals=None):
-    raw = num_str.lstrip('-')
-    has_neg = num_str.startswith('-')
-    candidates = []
-    for rec_len in range(1, 3):
-        if rec_len > len(raw): continue
-        rec = ('-' if has_neg else '') + raw[:rec_len]
-        try:
-            rec_val = int(rec)
-            if not (-100 <= rec_val <= 100): continue
-        except: continue
-        remain = raw[rec_len:]
-        for nums in split_7_fields(remain):
-            if ref_vals:
-                matches = sum(1 for i in range(7) if ref_vals[i] == nums[i])
-                if matches >= 6:
-                    candidates.append([rec_val] + nums)
-            else:
-                candidates.append([rec_val] + nums)
-    if not candidates: return None
-    if ref_vals:
-        candidates.sort(key=lambda r: (sum(1 for i in range(7) if ref_vals[i] == r[1:][i]),
-                                    -len(str(abs(r[0])))), reverse=True)
-        if sum(1 for i in range(7) if ref_vals[i] == candidates[0][1:][i]) < 6:
-            return None
-    return candidates[0]
-
-def extract_food_table(pdf_path, ref_lookup=None):
-    reader = PdfReader(pdf_path)
-    food_start = None
-    for i, page in enumerate(reader.pages):
-        if '个体化食物推荐表' in page.extract_text():
-            food_start = i
-            break
-    if food_start is None:
-        return [], 'not_found'
-
-    first_text = norm(reader.pages[food_start + 1].extract_text())
-    lines = [l.strip() for l in first_text.split('\n') if l.strip() and not re.match(r'\d+/\d+', l)]
-    is_compressed = sum(1 for l in lines[:10] if len(l) > 100) >= 3
-
-    rows = []
-    if is_compressed:
-        fmt = 'compressed'
-        for i in range(food_start + 1, len(reader.pages)):
-            text = norm(reader.pages[i].extract_text())
-            text = re.sub(r'\d+/\d+', '', text)
-            header = '名称分类推荐指数能量KJ蛋白g脂肪g碳水化合物g淀粉g总膳食纤维g胆固醇mg'
-            text = text.replace(header, '')
-            for kw in FOOD_SKIP_TEXTS:
-                text = text.replace(kw, '')
-            while text:
-                best_cat, best_idx = None, len(text)
-                for cat in KNOWN_CATS:
-                    idx = text.find(cat)
-                    if idx != -1 and idx < best_idx:
-                        best_idx, best_cat = idx, cat
-                if best_cat is None: break
-                name = text[:best_idx]
-                text = text[best_idx + len(best_cat):]
-                num_str = ''
-                while text and (text[0].isdigit() or text[0] in '-\u2212\u2014'):
-                    c = '-' if text[0] in '\u2212\u2014' else text[0]
-                    num_str += c
-                    text = text[1:]
-                if not name or not num_str: continue
-                ref_vals = ref_lookup.get(name) if ref_lookup else None
-                decoded = decode_compressed(name, num_str, ref_vals)
-                if decoded:
-                    rows.append(dict(zip(COLUMNS_FOOD, [name, best_cat] + [str(v) for v in decoded])))
-    else:
-        fmt = 'vertical'
-        all_lines = []
-        for i in range(food_start + 1, len(reader.pages)):
-            for line in norm(reader.pages[i].extract_text()).split('\n'):
-                lt = line.strip()
-                if not lt or re.match(r'\d+/\d+', lt) or lt in COLUMNS_FOOD:
-                    continue
-                if len(lt) > 60 and any(k in lt for k in FOOD_SKIP_TEXTS):
-                    continue
-                all_lines.append(lt)
-        i = 0
-        while i + 9 < len(all_lines):
-            name = all_lines[i].strip()
-            cat = all_lines[i + 1].strip()
-            if cat not in KNOWN_CATS:
-                i += 1
-                continue
-            nums = []
-            ok = True
-            for j in range(2, 10):
-                v = all_lines[i + j].replace('\u2212', '-').replace('\u2014', '-').strip()
-                try: int(v); nums.append(v)
-                except: ok = False; break
-            if ok and len(nums) == 8:
-                rows.append(dict(zip(COLUMNS_FOOD, [name, cat] + nums)))
-            i += 1
-    return rows, fmt
-
-
-# =====================================================
-# 肠道屏障 - 三元组格式解析
-# =====================================================
-def extract_barrier_triplet(lines, section_keyword):
-    results = {}
-    found = False
-    i = 0
-    while i < len(lines):
-        if section_keyword in lines[i]:
-            found = True
-            i += 1
-            continue
-        if not found:
-            i += 1
-            continue
-        if lines[i] in ['短链脂肪酸', '抗生素风险', '抗生素耐药风险',
-                         '神经递质', '神经递质及激素指标', '神经递质及激素',
-                         '个体化食物推荐表']:
-            break
-        if lines[i] in ['名称', '评估值', '正常范围', '过量', '缺乏']:
-            i += 1
-            continue
-        if '过量' in lines[i] or '缺乏' in lines[i] or '相关症状' in lines[i]:
-            i += 1
-            continue
-
-        # Try inline: "肠道炎症水平 36 正常 0-80 症状..."
-        parts = lines[i].split()
-        val_idx = None
-        for vi, p in enumerate(parts):
-            if re.match(r'^\d+$', p) and vi >= 1:
-                val_idx = vi
-                break
-        if val_idx:
-            name = ' '.join(parts[:val_idx])
-            val = parts[val_idx]
-            status = ''
-            normal_range = ''
-            symptoms = ''
-            for rp in parts[val_idx+1:]:
-                if rp in ['正常', '过多', '轻度产气', '过低', '不足']:
-                    status = rp
-                elif re.match(r'^\d+-\d+$', rp):
-                    normal_range = rp
-                elif not re.match(r'^[\d.]+$', rp):
-                    symptoms += rp + ' '
-            # 读取后续行作为症状(有些症状分行显示)
-            j = i + 1
-            while j < len(lines) and len(lines[j]) > 5 and not re.match(r'^\d+[-/,]', lines[j]):
-                if any(lines[j].startswith(sk) for sk in ['短链脂肪酸', '抗生素风险', '神经递质']):
-                    break
-                symptoms += lines[j] + ' '
-                j += 1
-            i = j
-            results[name] = {
-                '名称': name, '评估值': val, '健康状况': status,
-                '正常范围': normal_range, '症状': symptoms.strip()
-            }
-        elif i + 1 < len(lines) and re.match(r'^\d+$', lines[i+1]):
-            name = lines[i]
-            val = lines[i+1]
-            status = ''
-            normal_range = ''
-            symptoms = ''
-            for j in range(2, min(8, len(lines)-i)):
-                if lines[i+j] in ['正常', '过多', '轻度产气', '过低', '不足']:
-                    status = lines[i+j]
-                elif re.match(r'^\d+-\d+$', lines[i+j]):
-                    normal_range = lines[i+j]
-                    if i+j+1 < len(lines) and not re.match(r'^\d+[-/,]', lines[i+j+1]) and lines[i+j+1] not in ['短链脂肪酸', '抗生素风险', '神经递质', '神经递质及激素指标']:
-                        symptoms = lines[i+j+1]
-                    i += (j + 1 + (1 if symptoms else 0))
-                    break
-            else:
-                i += 3
-            if name not in ['名称', '评估值', '正常范围', '过量', '缺乏']:
-                results[name] = {
-                    '名称': name, '评估值': val, '健康状况': status,
-                    '正常范围': normal_range, '症状': symptoms.strip()
-                }
-        else:
-            i += 1
-    return results
-
-
-# =====================================================
-# 主流程
-# =====================================================
-def main():
-    pdf_files = sorted(f for f in os.listdir(BASE) if f.lower().endswith('.pdf'))
-    if not pdf_files:
-        print('未找到PDF文件')
-        return
-
-    all_data = {}
-    print('读取PDF文件...')
-    for pdf_file in pdf_files:
-        pdf_path = os.path.join(BASE, pdf_file)
-        label = pdf_file.replace('.pdf', '')
-        try:
-            reader = PdfReader(pdf_path)
-            pages_text = [p.extract_text() for p in reader.pages]
-            fmt = detect_format(pages_text)
-            all_data[label] = {'reader': reader, 'pages_text': pages_text, 'fmt': fmt}
-            print(f'  {label}: {len(pages_text)} pages, format={fmt}')
-        except Exception as e:
-            print(f'  {label}: ERROR - {e}')
-
-    if not all_data:
-        print('无可处理的PDF')
-        return
-
-    # ── 1. 报告概述 ──
-    print('\n[1/11] 报告概述...')
-    overviews = []
-    for label, d in all_data.items():
-        lines = clean_lines(d['pages_text'][0])
-        # 如果第一页没有关键信息,找有"基本信息"和"肠道预测年龄"的页
-        found_info = any(k in '\n'.join(lines) for k in ['肠道预测年龄', '核心菌属'])
-        if not found_info:
-            for pt in d['pages_text']:
-                if '基本信息' in norm(pt) and '肠道预测年龄' in norm(pt):
-                    lines = clean_lines(pt)
-                    break
-        r = extract_overview(lines, label)
-        overviews.append(r)
-
-    overview_cols = ['姓名', '编号', '年龄', '性别', '肠道预测年龄', '肠型',
-                     '肠道菌群平衡', '菌群多样性', '有益菌', '有害菌', '核心菌属',
-                     '健康总分', '菌群健康', '慢病控制', '营养均衡']
-    with open(os.path.join(OUTDIR, '报告概述.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-        w = csv.DictWriter(f, fieldnames=overview_cols, extrasaction='ignore')
-        w.writeheader()
-        w.writerows(overviews)
-    print(f'  -> CSV/报告概述.csv ({len(overviews)} 行)')
-
-    all_full_text = {}
-    all_full_lines = {}
-    for label, d in all_data.items():
-        all_full_text[label] = '\n\n---PAGEBREAK---\n\n'.join(norm(p.extract_text()) for p in d['reader'].pages)
-        lines = []
-        for pt in d['pages_text']:
-            lines.extend(clean_lines(pt))
-        all_full_lines[label] = lines
-
-    # ── 2-6, 9. 模块 ──
-    module_configs = {
-        '疾病风险评估': {'end': ['主要营养评估', '氨基酸评估', '维生素评估', '微量元素评估',
-                              '主要消化道致病菌'], 'name_col': '疾病', 'file': '疾病风险评估.csv'},
-        '主要营养评估': {'end': ['氨基酸评估', '维生素评估', '微量元素评估', '主要消化道致病菌'],
-                      'name_col': '指标', 'file': '主要营养评估.csv'},
-        '氨基酸评估': {'end': ['维生素评估', '微量元素评估', '主要消化道致病菌'],
-                    'name_col': '氨基酸', 'file': '氨基酸评估.csv'},
-        '维生素评估': {'end': ['微量元素评估', '主要消化道致病菌'],
-                    'name_col': '维生素', 'file': '维生素评估.csv'},
-        '微量元素评估': {'end': ['主要消化道致病菌'],
-                      'name_col': '微量元素', 'file': '微量元素评估.csv'},
-        '抗生素风险评估': {'end': ['抗生素耐药风险', '个体化食物推荐表'],
-                        'name_col': '抗生素', 'file': '抗生素风险评估.csv'},
-    }
-
-    for section_name, cfg in module_configs.items():
-        n = list(module_configs.keys()).index(section_name) + 2
-        print(f'[{n}/11] {section_name}...')
-        name_col = cfg['name_col']
-        data = {}
-
-        for label, d in all_data.items():
-            if d['fmt'] == 'triplet':
-                lines = all_full_lines[label]
-                sidx = -1
-                for i, line in enumerate(lines):
-                    if line == section_name:
-                        sidx = i
-                        break
-                if sidx == -1:
-                    continue
-                results = extract_triplet_module(lines[sidx+1:], end_markers=cfg['end'])
-            else:
-                text = all_full_text[label]
-                sidx = text.find(section_name)
-                if sidx == -1:
-                    continue
-                end_pos = len(text)
-                for em in cfg['end']:
-                    ei = text.find(em, sidx)
-                    if ei != -1 and ei < end_pos:
-                        end_pos = ei
-                section_text = text[sidx:end_pos]
-                results = extract_inline_module(section_text)
-
-            for r in results:
-                data.setdefault(r['名称'], {})[label] = r['数值']
-
-        if data:
-            labels = list(all_data.keys())
-            with open(os.path.join(OUTDIR, cfg['file']), 'w', newline='', encoding='utf-8-sig') as f:
-                w = csv.DictWriter(f, fieldnames=[name_col] + labels)
-                w.writeheader()
-                for name, vals in sorted(data.items()):
-                    row = {name_col: name}
-                    row.update(vals)
-                    w.writerow(row)
-            print(f'  -> CSV/{cfg["file"]} ({len(data)} 指标)')
-        else:
-            print(f'  (无数据)')
-
-    # ── 7. 主要消化道致病菌 ──
-    print('[7/11] 主要消化道致病菌...')
-    path_data = {}
-    for label, d in all_data.items():
-        if d['fmt'] == 'triplet':
-            rows = extract_pathogens_triplet(all_full_lines[label])
-        else:
-            text = all_full_text[label]
-            sidx = text.find('主要消化道致病菌')
-            eidx = text.find('肠道屏障', sidx)
-            section_text = text[sidx:eidx]
-            rows = extract_pathogens_inline(section_text)
-        for r in rows:
-            path_data.setdefault(r['致病菌'], {})[label] = r['丰度']
-
-    if path_data:
-        labels = list(all_data.keys())
-        with open(os.path.join(OUTDIR, '主要消化道致病菌.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-            w = csv.DictWriter(f, fieldnames=['致病菌'] + labels)
-            w.writeheader()
-            for name, vals in sorted(path_data.items()):
-                row = {'致病菌': name}
-                row.update(vals)
-                w.writerow(row)
-        print(f'  -> CSV/主要消化道致病菌.csv ({len(path_data)} 菌种)')
-
-    # ── 8. 肠道屏障及代谢物 + 短链脂肪酸 ──
-    print('[8/11] 肠道屏障及代谢物...')
-    with open(os.path.join(OUTDIR, '肠道屏障及代谢物.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-        w = csv.writer(f)
-        w.writerow(['指标', '姓名', '评估值', '健康状况', '正常范围', '症状'])
-        total = 0
-
-        for label, d in all_data.items():
-            if d['fmt'] == 'triplet':
-                results = extract_barrier_triplet(all_full_lines[label], '肠道屏障')
-            else:
-                text = all_full_text[label]
-                m = re.search(r'肠道屏障及菌群代谢物(.+?)(?:短链脂肪酸|$)', text, re.DOTALL)
-                results = extract_barrier_inline(m.group(1)) if m else {}
-
-            for nm, info in results.items():
-                w.writerow([nm, label, info.get('评估值',''), info.get('健康状况',''),
-                           info.get('正常范围',''), info.get('症状','')])
-                total += 1
-    print(f'  -> CSV/肠道屏障及代谢物.csv ({total} 条)')
-
-    # 短链脂肪酸
-    print('  [短链脂肪酸]...')
-    scfa_total = 0
-    with open(os.path.join(OUTDIR, '肠道屏障及代谢物.csv'), 'a', newline='', encoding='utf-8-sig') as f:
-        w = csv.writer(f)
-        for label, d in all_data.items():
-            if d['fmt'] == 'triplet':
-                results = extract_barrier_triplet(all_full_lines[label], '短链脂肪酸')
-            else:
-                text = all_full_text[label]
-                m = re.search(r'短链脂肪酸(.+?)(?:神经递质|抗生素风险|$)', text, re.DOTALL)
-                results = extract_barrier_inline(m.group(1)) if m else {}
-
-            for nm, info in results.items():
-                w.writerow([nm, label, info.get('评估值',''), info.get('健康状况',''),
-                           info.get('正常范围',''), info.get('症状','')])
-                scfa_total += 1
-    print(f'    (短链脂肪酸 {scfa_total} 条, 已追加)')
-
-    # ── 10. 个体化食物推荐表 ──
-    print('[10/11] 个体化食物推荐表...')
-    ref_nutrition = {}
-    for label in all_data:
-        if '侯' in label:
-            pdf_path = os.path.join(BASE, label + '.pdf')
-            ref_rows, _ = extract_food_table(pdf_path)
-            for r in ref_rows:
-                ref_nutrition[r['名称']] = [int(r[k]) for k in
-                    ['能量KJ', '蛋白g', '脂肪g', '碳水化合物g', '淀粉g', '总膳食纤维g', '胆固醇mg']]
-            break
-
-    for label, d in all_data.items():
-        pdf_path = os.path.join(BASE, label + '.pdf')
-        rows, fmt = extract_food_table(pdf_path, ref_nutrition)
-        fname = f'{label}-个体化食物推荐表.csv'
-        with open(os.path.join(OUTDIR, fname), 'w', newline='', encoding='utf-8-sig') as f:
-            w = csv.DictWriter(f, fieldnames=COLUMNS_FOOD)
-            w.writeheader()
-            w.writerows(rows)
-        print(f'  -> CSV/{fname} ({len(rows)} 条, {fmt})')
-
-    # ── 11. 推荐指数汇总 ──
-    print('[11/11] 推荐指数汇总...')
-    rec_all = {}
-    for label, d in all_data.items():
-        pdf_path = os.path.join(BASE, label + '.pdf')
-        rows, _ = extract_food_table(pdf_path, ref_nutrition)
-        rec_all[label] = {r['名称']: r['推荐指数'] for r in rows}
-
-    std_label = next((l for l in all_data if '侯' in l), list(all_data.keys())[0])
-    pdf_path = os.path.join(BASE, std_label + '.pdf')
-    std_rows, _ = extract_food_table(pdf_path)
-
-    labels_all = list(all_data.keys())
-    sum_cols = ['名称', '分类'] + ['能量KJ', '蛋白g', '脂肪g', '碳水化合物g', '淀粉g',
-                                    '总膳食纤维g', '胆固醇mg'] + labels_all
-    with open(os.path.join(OUTDIR, '推荐指数汇总.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-        w = csv.DictWriter(f, fieldnames=sum_cols)
-        w.writeheader()
-        for r in std_rows:
-            name = r['名称']
-            row = {'名称': name, '分类': r['分类']}
-            for k in ['能量KJ', '蛋白g', '脂肪g', '碳水化合物g', '淀粉g', '总膳食纤维g', '胆固醇mg']:
-                row[k] = r[k]
-            for la in labels_all:
-                row[la] = rec_all.get(la, {}).get(name, '')
-            w.writerow(row)
-    print(f'  -> CSV/推荐指数汇总.csv ({len(std_rows)} 行)')
-    for la in labels_all:
-        missing = sum(1 for r in std_rows if not rec_all.get(la, {}).get(r['名称'], ''))
-        print(f'    {la}: {"完整" if missing == 0 else f"缺失 {missing} 条"}')
-
-    print(f'\n完成!所有CSV已输出到 {OUTDIR}/')
-
-
-if __name__ == '__main__':
-    main()

+ 0 - 740
docs/参考资料/extract_full_report_v4.py

@@ -1,740 +0,0 @@
-"""
-肠道菌群健康检测报告 — 全指标提取脚本(v4)
-========================================
-基于PDF实际文本格式精确解析。
-
-三元组格式结构:
-  - p0: 基本信息(姓名/编号/年龄/性别/肠道预测年龄/肠型/核心菌属等)
-  - p1: 指标范围 + 疾病风险评估(三元组)
-  - p2: 指标范围 + 营养状况评估(三元组,含碳水/蛋白/脂肪/纤维/乳制品 以及 氨基酸)
-     末尾:主要营养评估 / 氨基酸评估
-  - p3: 指标范围 + 剩余氨基酸评估
-  - p4: 指标范围 + 维生素评估(含铁/锌也在其中)
-     末尾:维生素评估 / 微量元素评估
-  - p5: 主要消化道致病菌(三元组) + 肠道屏障及菌群代谢物(五元组)
-  - p6: 短链脂肪酸 + 神经递质及激素
-  - p7: 指标范围 + 抗生素风险评估
-  ...
-
-用法:python extract_full_report_v4.py
-"""
-
-import sys, os, csv, re
-sys.stdout.reconfigure(encoding='utf-8')
-sys.stderr.reconfigure(encoding='utf-8')
-from PyPDF2 import PdfReader
-
-BASE = r'D:\workspace\cfc\docs\参考资料'
-OUTDIR = os.path.join(BASE, 'CSV')
-os.makedirs(OUTDIR, exist_ok=True)
-
-RADICAL_MAP = {
-    '\u2f18': '卜', '\u2f1f': '土', '\u2f24': '大', '\u2f26': '子',
-    '\u2f29': '小', '\u2f2d': '山', '\u2f32': '干', '\u2f3c': '心',
-    '\u2f42': '文', '\u2f46': '无', '\u2f4a': '木', '\u2f50': '比',
-    '\u2f54': '水', '\u2f55': '火', '\u2f5c': '牛', '\u2f5f': '玉',
-    '\u2f60': '瓜', '\u2f62': '甘', '\u2f63': '生', '\u2f64': '用',
-    '\u2f69': '白', '\u2f6a': '皮', '\u2f6c': '目', '\u2f6f': '石',
-    '\u2f75': '竹', '\u2f76': '米', '\u2f7a': '羊', '\u2f7b': '羽',
-    '\u2f7c': '老', '\u2f7f': '耳', '\u2f81': '肉', '\u2f90': '衣',
-    '\u2f95': '谷', '\u2f96': '豆', '\u2f9d': '身', '\u2fa6': '金',
-    '\u2faf': '面', '\u2fb2': '韭', '\u2fb9': '香', '\u2fca': '黑',
-    '\u2ec9': '贝', '\u2edd': '食', '\u2ee2': '马', '\u2ee5': '鱼',
-    '\u2ee8': '麦', '\u2ee9': '黄', '\u2ef0': '龙',
-}
-
-COLUMNS_FOOD = ['名称', '分类', '推荐指数', '能量KJ', '蛋白g', '脂肪g',
-                '碳水化合物g', '淀粉g', '总膳食纤维g', '胆固醇mg']
-KNOWN_CATS = ['主食', '乳制品', '干果', '坚果', '快餐', '水产品',
-              '水果', '汤', '肉类', '蔬菜', '豆类及豆制品', '蛋类', '饮料']
-FOOD_SKIP_TEXTS = [
-    '根据您的肠道菌群', '分值从-100', '食物推荐考虑', '食物推荐是综合',
-    '需要注意的是', '本饮食推荐', '该饮食推荐根据', '后续表格中的营养',
-    '16S 高通量测序', '基于机器学习和', '肠道菌群健康检测报告说明',
-    '检测方法及局限性', '数据分析及模型', '结果解读及使用',
-    '影响因素说明', '建议将检测结果', '营养建议说明',
-    '重要提示', '推荐食物清单', '实际食用时需结合', '如有特殊疾病',
-    '免责声明', '本检测报告仅供', '以上模型预测', '正常范围的定义',
-    '募极生物',
-]
-
-def norm(s):
-    return ''.join(RADICAL_MAP.get(c, c) for c in s)
-
-
-def clean_lines(text):
-    lines = []
-    for line in norm(text).split('\n'):
-        ls = line.strip()
-        if not ls or re.match(r'^\d+/\d+$', ls):
-            continue
-        lines.append(ls)
-    return lines
-
-
-def detect_format(pages_text):
-    for pt in pages_text:
-        t = norm(pt)
-        if '疾病风险评估' in t and '指标范围' in t:
-            for line in t.split('\n'):
-                ls = line.strip()
-                if not ls: continue
-                if re.search(r'[\u4e00-\u9fff]+\d+\.\d+[\u4e00-\u9fff]+', ls):
-                    return 'inline'
-            return 'triplet'
-    return 'triplet'
-
-
-# ── 三元组解析 ──
-def parse_triplet(lines):
-    """从行列表中解析三元组(名称/数值/状态)。返回 [{名称, 数值, 状态}] 和剩余行"""
-    results = []
-    i = 0
-    while i < len(lines):
-        name = lines[i]
-        if i + 2 >= len(lines):
-            break
-        val = lines[i + 1]
-        status = lines[i + 2]
-        if re.match(r'^-?\d+\.?\d*$', val):
-            results.append({'名称': name, '数值': val, '状态': status})
-            i += 3
-        else:
-            i += 1
-    return results
-
-def parse_triplet_until(lines, stop_markers):
-    """解析三元组直到遇到stop_markers"""
-    results = []
-    i = 0
-    while i < len(lines):
-        if any(lines[i] == sm or lines[i].startswith(sm) for sm in stop_markers):
-            break
-        if lines[i] == '指标范围':
-            i += 1
-            continue
-        name = lines[i]
-        if i + 2 >= len(lines):
-            break
-        val = lines[i + 1]
-        status = lines[i + 2]
-        if re.match(r'^-?\d+\.?\d*$', val):
-            results.append({'名称': name, '数值': val, '状态': status})
-            i += 3
-        else:
-            i += 1
-    return results, lines[i:]
-
-# ── inline解析 ──
-def parse_inline(text, stop_patterns=None):
-    """压缩同行格式解析"""
-    results = []
-    pattern = r'([\u4e00-\u9fff()\u2014-]+?)(\d+(?:\.\d+)?)([\u4e00-\u9fff/]+)'
-    for m in re.finditer(pattern, text):
-        name = m.group(1).strip()
-        val = m.group(2)
-        status = m.group(3).strip()
-        # 严格过滤
-        if len(name) <= 1: continue
-        if any(k in name for k in ['指标范围', '疾病风险', '营养状况', '抗生素风险',
-                                      '注:', '注:', '页']):
-            continue
-        if any(k in status for k in ['指标范围', '疾病风险', '养分', '范例']):
-            continue
-        try:
-            fv = float(val)
-            if fv >= 0 and fv <= 1000:
-                results.append({'名称': name, '数值': val, '状态': status})
-        except:
-            pass
-    return results
-
-def parse_inline_region(text, start_marker, end_markers):
-    """从文本中找开始标记到结束标记之间的区域,用inline解析"""
-    sidx = text.find(start_marker)
-    if sidx == -1:
-        return [], text
-    end_pos = len(text)
-    for em in end_markers:
-        ei = text.find(em, sidx + len(start_marker))
-        if ei != -1 and ei < end_pos:
-            end_pos = ei
-    region = text[sidx:end_pos]
-    results = parse_inline(region)
-    return results, region
-
-
-# ==========================================
-# 报告概述
-# ==========================================
-def extract_overview(lines_all, label):
-    r = {'姓名': label}
-    t = '\n'.join(lines_all)
-
-    m = re.search(r'编号\s*(\S+)', t)
-    if m: r['编号'] = m.group(1)
-    m = re.search(r'姓名\s*(\S+)', t)
-    if m: r['姓名'] = m.group(1)
-    for pat in ['年龄', '性别']:
-        m = re.search(rf'{pat}\s*(\S+)', t)
-        if m: r[pat] = m.group(1)
-    m = re.search(r'肠道预测年龄[:\s]*([\d.]+岁?)', t)
-    if m: r['肠道预测年龄'] = m.group(1)
-    m = re.search(r'肠型[:\s]*(\S+)', t)
-    if m: r['肠型'] = m.group(1)
-    for kw in ['肠道菌群平衡', '菌群多样性', '有益菌', '有害菌', '核心菌属']:
-        m = re.search(rf'{kw}\s*(\d+)', t)
-        if m: r[kw] = m.group(1)
-    m = re.search(r'健康总分\s*(\d+)', t)
-    if m: r['健康总分'] = m.group(1)
-    for kw in ['菌群健康', '慢病控制', '营养均衡']:
-        m = re.search(rf'{kw}\s*(\d+)', t)
-        if m: r[kw] = m.group(1)
-    return r
-
-
-# ==========================================
-# 三元组格式 - 按页提取各模块
-# ==========================================
-def extract_all_triplet(all_lines):
-    """
-    从三元组格式的全量行列表中按页提取各模块。
-    all_lines: 所有页的clean_lines合并
-    
-    返回 {模块名: [{名称, 数值, 状态}]}
-    """
-    # 找到所有"指标范围"的位置(标记数据页面开始)
-    data_pages = []
-    for i, line in enumerate(all_lines):
-        if line == '指标范围':
-            data_pages.append(i)
-    
-    result = {}
-    
-    # 数据页1: 疾病风险评估(指标范围 → 主要营养评估/氨基酸评估/致病菌)
-    if len(data_pages) >= 1:
-        i = data_pages[0] + 1
-        # 跳过指标范围后的第一行(模块标题:疾病风险评估)
-        if i < len(all_lines) and all_lines[i] == '疾病风险评估':
-            i += 1
-        rows, _ = parse_triplet_until(all_lines[i:], ['主要营养评估', '氨基酸评估', '维生素评估',
-                                                          '微量元素评估', '主要消化道致病菌',
-                                                          '抗生素风险评估', '抗生素耐药风险'])
-        result['疾病风险评估'] = [r for r in rows if '注:' not in r['名称'] and '注:' not in r['名称']]
-    
-    # 数据页2: 营养状况评估(指标范围 → 氨基酸评估/主要营养评估)
-    if len(data_pages) >= 2:
-        i = data_pages[1] + 1
-        if i < len(all_lines) and all_lines[i] == '营养状况评估':
-            i += 1
-        
-        # 碳水/蛋白/脂肪/纤维/乳制品 → 主要营养评估(5个指标)
-        rows, remainder = parse_triplet_until(all_lines[i:], ['主要营养评估', '氨基酸评估'])
-        result['主要营养评估'] = rows[:5]
-        
-        # 氨基酸部分(从苏氨酸开始,到氨基酸评估标记)
-        ama_rows, _ = parse_triplet_until(remainder, ['氨基酸评估'])
-        result['氨基酸评估_p2'] = ama_rows
-    
-    # 数据页3: 剩余氨基酸(指标范围 → 氨基酸评估)
-    if len(data_pages) >= 3:
-        i = data_pages[2] + 1
-        if i < len(all_lines) and all_lines[i] == '氨基酸评估'[:3]:  # 可能包含"氨基酸评估"
-            while i < len(all_lines) and '氨基酸' in all_lines[i]:
-                i += 1
-        remaining_amino, _ = parse_triplet_until(all_lines[i:], ['氨基酸评估'])
-        result['氨基酸评估_p3'] = remaining_amino
-    
-    # 数据页4: 维生素评估(指标范围 → 微量元素评估/主要消化道致病菌)
-    if len(data_pages) >= 4:
-        i = data_pages[3] + 1
-        if i < len(all_lines) and all_lines[i] == '维生素评估':
-            i += 1
-        
-        # 这里包含了维生素 + 微量元素(铁、锌)
-        vit_rows, remainder = parse_triplet_until(all_lines[i:], ['微量元素评估', '主要消化道致病菌'])
-        
-        # 前9个是维生素(维生素A到维生素D),后面是微量元素
-        vit_names = set(['维生素A', '维生素B1', '维生素B2', '维生素B5', '维生素B6',
-                        '叶酸', '维生素B12', '维生素C', '维生素D'])
-        vit = []
-        trace = []
-        for r in vit_rows:
-            if r['名称'] in vit_names or '维生素' in r['名称']:
-                vit.append(r)
-            else:
-                trace.append(r)
-        result['维生素评估'] = vit
-        result['微量元素评估'] = trace
-    
-    # 数据页5: 主要消化道致病菌(已在页面中)
-    # 使用5行一组:名称/丰度%/评估
-    for i in range(len(all_lines)):
-        if all_lines[i] == '主要消化道致病菌':
-            j = i + 1
-            # 跳过头
-            while j < len(all_lines) and all_lines[j] in ['致病菌', '丰度', '评估']:
-                j += 1
-            path_rows = []
-            while j < len(all_lines) and not all_lines[j].startswith('肠道屏障'):
-                name = all_lines[j]
-                if j + 2 < len(all_lines) and re.match(r'^\d+%$', all_lines[j+1]):
-                    path_rows.append({'致病菌': name, '丰度': all_lines[j+1], '评估': all_lines[j+2]})
-                    j += 3
-                else:
-                    j += 1
-            result['主要消化道致病菌'] = path_rows
-            break
-    
-    # 抗生素风险评估
-    for i in range(len(all_lines)):
-        if all_lines[i] == '抗生素风险评估':
-            j = i + 1
-            abx_rows, _ = parse_triplet_until(all_lines[j:], ['抗生素耐药风险', '个体化食物推荐表'])
-            result['抗生素风险评估'] = abx_rows
-            break
-    
-    return result
-
-
-# ==========================================
-# 肠道屏障及代谢物 - 三元组格式
-# ==========================================
-def extract_barrier_and_scfa_triplet(all_lines):
-    """
-    解析肠道屏障 + 短链脂肪酸数据
-    格式:名称/数值/状态/范围/症状(行模式或跨行)
-    """
-    results = {'barrier': [], 'scfa': [], 'neurotransmitter': []}
-    
-    current_section = None
-    i = 0
-    while i < len(all_lines):
-        if all_lines[i] == '肠道屏障及菌群代谢物':
-            current_section = 'barrier'
-            i += 1
-            continue
-        if '短链脂肪酸' in all_lines[i]:
-            current_section = 'scfa'
-            i += 1
-            continue
-        if '神经递质' in all_lines[i]:
-            current_section = 'neurotransmitter'
-            i += 1
-            continue
-        if current_section is None:
-            i += 1
-            continue
-        
-        if all_lines[i] in ['名称', '评估值', '正常范围', '过量', '缺乏', '相关症状'] or \
-           '过量 /' in all_lines[i] or '缺乏' in all_lines[i]:
-            i += 1
-            continue
-        if current_section == 'barrier' and all_lines[i] in ['短链脂肪酸', '抗生素风险', '抗生素耐药风险']:
-            break
-        if current_section == 'scfa' and all_lines[i] in ['神经递质', '神经递质及激素指标', '神经递质及激素', '抗生素风险']:
-            break
-        if current_section == 'neurotransmitter' and all_lines[i] in ['抗生素风险', '个体化食物推荐表']:
-            break
-        
-        # 模式1:一行内包含名称+数值+状态
-        parts = all_lines[i].split()
-        if len(parts) >= 3:
-            vi = None
-            for pi, p in enumerate(parts):
-                if re.match(r'^\d+$', p) and pi >= 1:
-                    vi = pi
-                    break
-            if vi:
-                name = ' '.join(parts[:vi])
-                val = parts[vi]
-                status = ''
-                range_ = ''
-                for rp in parts[vi+1:]:
-                    if rp in ['正常', '过多', '轻度产气', '过低', '不足']:
-                        status = rp
-                    elif re.match(r'^\d+-\d+$', rp):
-                        range_ = rp
-                results[current_section].append({
-                    '名称': name, '评估值': val, '健康状况': status, '正常范围': range_
-                })
-                i += 1
-                continue
-        
-        # 模式2:逐行(名称/数值/状态/范围/症状)
-        if i + 3 < len(all_lines) and re.match(r'^\d+$', all_lines[i+1]):
-            name = all_lines[i]
-            val = all_lines[i+1]
-            status = all_lines[i+2]
-            range_ = ''
-            # 找范围
-            for j in range(3, min(8, len(all_lines)-i)):
-                if re.match(r'^\d+-\d+$', all_lines[i+j]):
-                    range_ = all_lines[i+j]
-                    break
-            results[current_section].append({
-                '名称': name, '评估值': val, '健康状况': status, '正常范围': range_
-            })
-            i += 5 if range_ else 4
-            continue
-        
-        i += 1
-    
-    return results
-
-
-# ==========================================
-# 食物推荐表
-# ==========================================
-def split_7_fields(s):
-    results = []
-    ranges = [(2, 4), (1, 2), (1, 2), (1, 2), (1, 2), (1, 2), (1, 4)]
-    def backtrack(pos, idx, nums):
-        if idx == 7:
-            if pos == len(s):
-                results.append(list(nums))
-            return
-        if pos >= len(s): return
-        lo, hi = ranges[idx]
-        for w in range(lo, min(hi + 1, len(s) - pos + 1)):
-            chunk = s[pos:pos + w]
-            if chunk.isdigit():
-                backtrack(pos + w, idx + 1, nums + [int(chunk)])
-    backtrack(0, 0, [])
-    return results
-
-def decode_compressed(name, num_str, ref_vals=None):
-    raw = num_str.lstrip('-')
-    has_neg = num_str.startswith('-')
-    candidates = []
-    for rec_len in range(1, 3):
-        if rec_len > len(raw): continue
-        rec = ('-' if has_neg else '') + raw[:rec_len]
-        try:
-            rec_val = int(rec)
-            if not (-100 <= rec_val <= 100): continue
-        except: continue
-        remain = raw[rec_len:]
-        for nums in split_7_fields(remain):
-            if ref_vals:
-                matches = sum(1 for i in range(7) if ref_vals[i] == nums[i])
-                if matches >= 6:
-                    candidates.append([rec_val] + nums)
-            else:
-                candidates.append([rec_val] + nums)
-    if not candidates: return None
-    if ref_vals:
-        candidates.sort(key=lambda r: (sum(1 for i in range(7) if ref_vals[i] == r[1:][i]),
-                                    -len(str(abs(r[0])))), reverse=True)
-        if sum(1 for i in range(7) if ref_vals[i] == candidates[0][1:][i]) < 6:
-            return None
-    return candidates[0]
-
-def extract_food_table(pdf_path, ref_lookup=None):
-    reader = PdfReader(pdf_path)
-    food_start = None
-    for i, page in enumerate(reader.pages):
-        if '个体化食物推荐表' in page.extract_text():
-            food_start = i
-            break
-    if food_start is None:
-        return [], 'not_found'
-
-    first_text = norm(reader.pages[food_start + 1].extract_text())
-    lines = [l.strip() for l in first_text.split('\n') if l.strip() and not re.match(r'\d+/\d+', l)]
-    is_compressed = sum(1 for l in lines[:10] if len(l) > 100) >= 3
-
-    rows = []
-    if is_compressed:
-        fmt = 'compressed'
-        for i in range(food_start + 1, len(reader.pages)):
-            text = norm(reader.pages[i].extract_text())
-            text = re.sub(r'\d+/\d+', '', text)
-            header = '名称分类推荐指数能量KJ蛋白g脂肪g碳水化合物g淀粉g总膳食纤维g胆固醇mg'
-            text = text.replace(header, '')
-            for kw in FOOD_SKIP_TEXTS:
-                text = text.replace(kw, '')
-            while text:
-                best_cat, best_idx = None, len(text)
-                for cat in KNOWN_CATS:
-                    idx = text.find(cat)
-                    if idx != -1 and idx < best_idx:
-                        best_idx, best_cat = idx, cat
-                if best_cat is None: break
-                name = text[:best_idx]
-                text = text[best_idx + len(best_cat):]
-                num_str = ''
-                while text and (text[0].isdigit() or text[0] in '-\u2212\u2014'):
-                    c = '-' if text[0] in '\u2212\u2014' else text[0]
-                    num_str += c
-                    text = text[1:]
-                if not name or not num_str: continue
-                ref_vals = ref_lookup.get(name) if ref_lookup else None
-                decoded = decode_compressed(name, num_str, ref_vals)
-                if decoded:
-                    rows.append(dict(zip(COLUMNS_FOOD, [name, best_cat] + [str(v) for v in decoded])))
-    else:
-        fmt = 'vertical'
-        all_lines = []
-        for i in range(food_start + 1, len(reader.pages)):
-            for line in norm(reader.pages[i].extract_text()).split('\n'):
-                lt = line.strip()
-                if not lt or re.match(r'\d+/\d+', lt) or lt in COLUMNS_FOOD:
-                    continue
-                if len(lt) > 60 and any(k in lt for k in FOOD_SKIP_TEXTS):
-                    continue
-                all_lines.append(lt)
-        i = 0
-        while i + 9 < len(all_lines):
-            name = all_lines[i].strip()
-            cat = all_lines[i + 1].strip()
-            if cat not in KNOWN_CATS:
-                i += 1
-                continue
-            nums = []
-            ok = True
-            for j in range(2, 10):
-                v = all_lines[i + j].replace('\u2212', '-').replace('\u2014', '-').strip()
-                try: int(v); nums.append(v)
-                except: ok = False; break
-            if ok and len(nums) == 8:
-                rows.append(dict(zip(COLUMNS_FOOD, [name, cat] + nums)))
-            i += 1
-    return rows, fmt
-
-
-# ==========================================
-# 主流程
-# ==========================================
-def main():
-    pdf_files = sorted(f for f in os.listdir(BASE) if f.lower().endswith('.pdf'))
-    if not pdf_files:
-        print('未找到PDF文件')
-        return
-
-    all_data = {}
-    print('读取PDF文件...')
-    for pdf_file in pdf_files:
-        pdf_path = os.path.join(BASE, pdf_file)
-        label = pdf_file.replace('.pdf', '')
-        try:
-            reader = PdfReader(pdf_path)
-            pages_text = [p.extract_text() for p in reader.pages]
-            fmt = detect_format(pages_text)
-            all_data[label] = {'reader': reader, 'pages_text': pages_text, 'fmt': fmt}
-            print(f'  {label}: {len(pages_text)} pages, format={fmt}')
-        except Exception as e:
-            print(f'  {label}: ERROR - {e}')
-
-    if not all_data:
-        print('无可处理的PDF')
-        return
-
-    # 分离
-    triplet_labels = [l for l, d in all_data.items() if d['fmt'] == 'triplet']
-    inline_labels = [l for l, d in all_data.items() if d['fmt'] == 'inline']
-    all_labels = list(all_data.keys())
-
-    print(f'\ntriplet: {triplet_labels}, inline: {inline_labels}')
-
-    all_full_text = {}
-    all_full_lines = {}
-    for label, d in all_data.items():
-        all_full_text[label] = '\n\n---PAGEBREAK---\n\n'.join(norm(p.extract_text()) for p in d['reader'].pages)
-        lines = []
-        for pt in d['pages_text']:
-            lines.extend(clean_lines(pt))
-        all_full_lines[label] = lines
-
-    # ── 1. 报告概述 ──
-    print('\n[1/11] 报告概述...')
-    overviews = []
-    for label, d in all_data.items():
-        lines = clean_lines(d['pages_text'][0])
-        found_info = any(k in '\n'.join(lines) for k in ['肠道预测年龄', '核心菌属'])
-        if not found_info:
-            for pt in d['pages_text']:
-                if '基本信息' in norm(pt) and '肠道预测年龄' in norm(pt):
-                    lines = clean_lines(pt)
-                    break
-        r = extract_overview(lines, label)
-        overviews.append(r)
-
-    overview_cols = ['姓名', '编号', '年龄', '性别', '肠道预测年龄', '肠型',
-                     '肠道菌群平衡', '菌群多样性', '有益菌', '有害菌', '核心菌属',
-                     '健康总分', '菌群健康', '慢病控制', '营养均衡']
-    with open(os.path.join(OUTDIR, '报告概述.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-        w = csv.DictWriter(f, fieldnames=overview_cols, extrasaction='ignore')
-        w.writeheader()
-        w.writerows(overviews)
-    print(f'  -> CSV/报告概述.csv ({len(overviews)} 行)')
-
-    # ── 2-9. 模块数据 ──
-    # 定义模块:名称 -> (name_col, 文件, 在triplet中提取key, inline的start_marker, inline的end_markers)
-    modules = [
-        ('疾病风险评估', '疾病', '疾病风险评估.csv', '疾病风险评估', ['主要营养评估', '主要消化道致病菌']),
-        ('主要营养评估', '指标', '主要营养评估.csv', '营养状况评估', ['主要营养评估', '氨基酸评估']),
-        ('氨基酸评估', '氨基酸', '氨基酸评估.csv', '氨基酸评估', ['维生素评估', '主要消化道致病菌']),
-        ('维生素评估', '维生素', '维生素评估.csv', '维生素评估', ['微量元素评估', '主要消化道致病菌']),
-        ('微量元素评估', '微量元素', '微量元素评估.csv', '微量元素评估', ['主要消化道致病菌']),
-        ('抗生素风险评估', '抗生素', '抗生素风险评估.csv', '抗生素风险评估', ['抗生素耐药风险', '个体化食物推荐表']),
-    ]
-
-    for mod_name, name_col, fname, start_mk, end_mks in modules:
-        print(f'  [{mod_name}]...')
-        data = {}
-
-        for label in triplet_labels:
-            # triplet: 从所有行解析
-            parsed = extract_all_triplet(all_full_lines[label])
-            rows = parsed.get(mod_name, [])
-            if not rows:
-                # fallback: 找模块在行中的位置
-                if mod_name == '氨基酸评估':
-                    # 合并p2和p3
-                    rows = parsed.get('氨基酸评估_p2', []) + parsed.get('氨基酸评估_p3', [])
-            for r in rows:
-                data.setdefault(r['名称'], {})[label] = r['数值']
-
-        for label in inline_labels:
-            rows, _ = parse_inline_region(all_full_text[label], start_mk, end_mks)
-            for r in rows:
-                data.setdefault(r['名称'], {})[label] = r['数值']
-
-        if data:
-            labels = all_labels
-            with open(os.path.join(OUTDIR, fname), 'w', newline='', encoding='utf-8-sig') as f:
-                w = csv.DictWriter(f, fieldnames=[name_col] + labels)
-                w.writeheader()
-                for name, vals in sorted(data.items()):
-                    row = {name_col: name}
-                    row.update(vals)
-                    w.writerow(row)
-            print(f'    -> CSV/{fname} ({len(data)} 指标)')
-        else:
-            print(f'    (无数据)')
-
-    # ── 7. 主要消化道致病菌 ──
-    print('[7/11] 主要消化道致病菌...')
-    path_data = {}
-    for label in triplet_labels:
-        parsed = extract_all_triplet(all_full_lines[label])
-        for r in parsed.get('主要消化道致病菌', []):
-            path_data.setdefault(r['致病菌'], {})[label] = r['丰度']
-
-    for label in inline_labels:
-        rows, _ = parse_inline_region(all_full_text[label], '主要消化道致病菌', ['肠道屏障'])
-        for r in rows:
-            path_data.setdefault(r['名称'], {})[label] = r['数值'] if '%' in r['数值'] else r['数值'] + '%' if '未' not in r.get('状态','') else '0%'
-
-    if path_data:
-        labels = all_labels
-        with open(os.path.join(OUTDIR, '主要消化道致病菌.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-            w = csv.DictWriter(f, fieldnames=['致病菌'] + labels)
-            w.writeheader()
-            for name, vals in sorted(path_data.items()):
-                row = {'致病菌': name}
-                row.update(vals)
-                w.writerow(row)
-        print(f'  -> CSV/主要消化道致病菌.csv ({len(path_data)} 菌种)')
-
-    # ── 8. 肠道屏障及代谢物 ──
-    print('[8/11] 肠道屏障及代谢物...')
-    with open(os.path.join(OUTDIR, '肠道屏障及代谢物.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-        w = csv.writer(f)
-        w.writerow(['指标', '姓名', '评估值', '健康状况', '正常范围', '症状'])
-        total = 0
-
-        for label in triplet_labels:
-            bs = extract_barrier_and_scfa_triplet(all_full_lines[label])
-            for item in bs.get('barrier', []):
-                w.writerow([item['名称'], label, item.get('评估值',''), item.get('健康状况',''),
-                          item.get('正常范围',''), item.get('症状','')])
-                total += 1
-
-        for label in inline_labels:
-            # Not implemented for inline format yet
-            pass
-
-    print(f'  -> CSV/肠道屏障及代谢物.csv ({total} 条)')
-
-    # 短链脂肪酸
-    print('  [短链脂肪酸]...')
-    scfa_total = 0
-    with open(os.path.join(OUTDIR, '肠道屏障及代谢物.csv'), 'a', newline='', encoding='utf-8-sig') as f:
-        w = csv.writer(f)
-        for label in triplet_labels:
-            bs = extract_barrier_and_scfa_triplet(all_full_lines[label])
-            for item in bs.get('scfa', []):
-                w.writerow([item['名称'], label, item.get('评估值',''), item.get('健康状况',''),
-                          item.get('正常范围',''), item.get('症状','')])
-                scfa_total += 1
-    print(f'    (短链脂肪酸 {scfa_total} 条, 已追加)')
-
-    # 神经递质
-    print('  [神经递质]...')
-    nt_total = 0
-    with open(os.path.join(OUTDIR, '肠道屏障及代谢物.csv'), 'a', newline='', encoding='utf-8-sig') as f:
-        w = csv.writer(f)
-        for label in triplet_labels:
-            bs = extract_barrier_and_scfa_triplet(all_full_lines[label])
-            for item in bs.get('neurotransmitter', []):
-                w.writerow([item['名称'], label, item.get('评估值',''), item.get('健康状况',''),
-                          item.get('正常范围',''), item.get('症状','')])
-                nt_total += 1
-    print(f'    (神经递质 {nt_total} 条, 已追加)')
-
-    # ── 10. 个体化食物推荐表 ──
-    print('[10/11] 个体化食物推荐表...')
-    ref_nutrition = {}
-    for label in triplet_labels:
-        if '侯' in label:
-            pdf_path = os.path.join(BASE, label + '.pdf')
-            ref_rows, _ = extract_food_table(pdf_path)
-            for r in ref_rows:
-                ref_nutrition[r['名称']] = [int(r[k]) for k in
-                    ['能量KJ', '蛋白g', '脂肪g', '碳水化合物g', '淀粉g', '总膳食纤维g', '胆固醇mg']]
-            break
-
-    for label, d in all_data.items():
-        pdf_path = os.path.join(BASE, label + '.pdf')
-        rows, fmt = extract_food_table(pdf_path, ref_nutrition)
-        fname = f'{label}-个体化食物推荐表.csv'
-        with open(os.path.join(OUTDIR, fname), 'w', newline='', encoding='utf-8-sig') as f:
-            w = csv.DictWriter(f, fieldnames=COLUMNS_FOOD)
-            w.writeheader()
-            w.writerows(rows)
-        print(f'  -> CSV/{fname} ({len(rows)} 条, {fmt})')
-
-    # ── 11. 推荐指数汇总 ──
-    print('[11/11] 推荐指数汇总...')
-    rec_all = {}
-    for label, d in all_data.items():
-        pdf_path = os.path.join(BASE, label + '.pdf')
-        rows, _ = extract_food_table(pdf_path, ref_nutrition)
-        rec_all[label] = {r['名称']: r['推荐指数'] for r in rows}
-
-    std_label = next((l for l in triplet_labels if '侯' in l), triplet_labels[0])
-    pdf_path = os.path.join(BASE, std_label + '.pdf')
-    std_rows, _ = extract_food_table(pdf_path)
-
-    sum_cols = ['名称', '分类'] + ['能量KJ', '蛋白g', '脂肪g', '碳水化合物g', '淀粉g',
-                                    '总膳食纤维g', '胆固醇mg'] + all_labels
-    with open(os.path.join(OUTDIR, '推荐指数汇总.csv'), 'w', newline='', encoding='utf-8-sig') as f:
-        w = csv.DictWriter(f, fieldnames=sum_cols)
-        w.writeheader()
-        for r in std_rows:
-            name = r['名称']
-            row = {'名称': name, '分类': r['分类']}
-            for k in ['能量KJ', '蛋白g', '脂肪g', '碳水化合物g', '淀粉g', '总膳食纤维g', '胆固醇mg']:
-                row[k] = r[k]
-            for la in all_labels:
-                row[la] = rec_all.get(la, {}).get(name, '')
-            w.writerow(row)
-    print(f'  -> CSV/推荐指数汇总.csv ({len(std_rows)} 行)')
-
-    print(f'\n完成!所有CSV已输出到 {OUTDIR}/')
-
-
-if __name__ == '__main__':
-    main()