2026-08-03 15:39:50
Power BI是微软推出的一套强大的商业分析工具。它最早可追溯到Excel中的Power Pivot,Power Query。它在2015年正式发布,包含网页端的Power BI Service、桌面端的Power BI Desktop和移动版本。
Power BI专注于数据导入、清洗、呈现这一整个流程,和Excel相比,更适合可视化和分析数据。
比如我有个在线的demo,将每天统计的数据以csv的格式,保存为一个个文件,命名为YYYYMMDD.txt,例如下方示例:
2026/07/14 18:53:00, IP, Country, UserAgent, OCR
2026/07/14 18:53:00, IP, Country, UserAgent, Save
原始数据包含事件时间,访问者IP,访问者国家,浏览器UserAgent和事件名字,比如OCR、保存等等。
可以在Power BI中先建一个Semantic Model,通过Web获取这些数据,然后解析并保存。可以使用高级编辑器,使用以下命令进行存储:
let
// 1. 定义基础域名和相对路径
// 使用 RelativePath 参数实现相对路径引用
BaseUrl = "https://blog.xulihang.me",
// 2. 定义获取数据的日期范围(最近30天)
Days = 30,
EndDate = Date.AddDays(Date.From(DateTime.LocalNow()), -1),
StartDate = Date.AddDays(EndDate, -(Days - 1)),
// 3. 生成日期列表
DateList = List.Dates(StartDate, Days, #duration(1,0,0,0)),
// 4. 定义读取单个日志文件的函数
GetLog = (LogDate as date) as nullable table =>
let
// 将日期转为 YYYYMMDD 格式
DateStr = Date.ToText(LogDate, "yyyyMMdd"),
// 使用 Web.Contents 和 RelativePath 获取文件
Response = try Web.Contents(
BaseUrl,
[
RelativePath = "/" & DateStr & ".txt"
]
),
// 如果文件不存在则返回 null
Result = if Response[HasError] then
null
else
let
// 读取文件内容并按行分割
Lines = Lines.FromBinary(Response[Value], null, null, 65001),
// 解析每一行 CSV
ParseLine = (line as text) =>
let
Parts = Text.Split(line, ","),
Count = List.Count(Parts),
// 假设至少有5列:时间, IP, 国家, UserAgent, 事件名称
// 如果列数多于5,将中间多余列合并(处理 UserAgent 中可能包含逗号的情况)
Result = if Count >= 5 then
{
Parts{0}, // 事件时间
Parts{1}, // IP
Parts{2}, // 国家
Text.Combine(List.Range(Parts, 3, Count - 4), ","), // UserAgent(可能包含逗号)
Parts{Count-1} // 事件名称(最后一列)
}
else
null
in
Result,
// 过滤掉空行和解析失败的行
Parsed = List.RemoveNulls(List.Transform(Lines, each ParseLine(_))),
// 转换为表格
TableData = Table.FromRows(
Parsed,
{"事件时间", "IP", "国家", "UserAgent", "事件名称"}
),
// 添加日志日期列
AddDate = Table.AddColumn(
TableData,
"日志日期",
each LogDate,
type date
)
in
AddDate
in
Result,
// 5. 遍历所有日期,获取数据
Tables = List.RemoveNulls(List.Transform(DateList, each GetLog(_))),
// 6. 统一所有表的结构(确保列一致)
CleanTables = List.Transform(
Tables,
each Table.SelectColumns(
_,
{"事件时间", "IP", "国家", "UserAgent", "事件名称", "日志日期"},
MissingField.UseNull
)
),
// 7. 合并所有表
Combined = Table.Combine(CleanTables),
// 8. 设置正确的数据类型
ChangedType = Table.TransformColumnTypes(
Combined,
{
{"事件时间", type datetime},
{"IP", type text},
{"国家", type text},
{"UserAgent", type text},
{"事件名称", type text},
{"日志日期", type date}
}
)
in
ChangedType
以上存储的是原始数据,我们如果想基于原始数据计算出更多列,可以新建一个列,比如根据UserAgent计算操作系统:
OS =
VAR UA = LOWER(RawLogs[UserAgent])
RETURN
SWITCH(
TRUE(),
CONTAINSSTRING(UA,"windows"),"Windows",
CONTAINSSTRING(UA,"android"),"Android",
CONTAINSSTRING(UA,"iphone") || CONTAINSSTRING(UA,"ipad"),"iOS",
CONTAINSSTRING(UA,"macintosh"),"macOS",
CONTAINSSTRING(UA,"linux"),"Linux",
"Other"
)
一个经常用到的概念叫Measure,它不是存储在表格中的数据,而是需要用到时,会动态计算的一个指标。比如以下计算唯一IP数量的指标。在可视化报表中,Measure可以根据各种条件,比如时间进行动态计算。
Visitors =
DISTINCTCOUNT(RawLogs[IP])
有了Semantic Model后,我们可以基于这个数据创建可视化报表了。有常见的饼图、折线图、漏斗图等等。
2026-07-16 14:27:50
代码缩进,使用4个空格或者制表符(Tab)表示一个层级,用来让代码有更好的可读性。而Python这样的语言,缩进是其语义的一部分,替代{}这样的括号。
有缩进的C语言代码:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
没有使用缩进的C语言代码:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
现在一般都推荐用空格来缩进。因为使用tab,在不同编辑器,不同偏好设置的表现会不一样。有的人用两个空格宽度显示tab,有的人喜欢四个空格宽度。
代码编辑器一般都有自动调整缩进的功能。比如Visual Studio Code,使用SHIFT+ALT+F,就可以按偏好设置统一缩进,比如将四个空格缩进的改成两个空格缩进。
2026-06-13 21:22:50
穿高跟鞋可以美化小腿形状、增高、抬头挺胸,增加穿着者的自信,但存在健康问题。最早高跟鞋是男人穿的,现在变成女性的专属。
高跟鞋可以突显女性的魅力,听着女人哒哒哒的脚步声,男人的心也为之一荡。和胸、屁股、长发等共同组成了女性的特质。
穿高跟鞋对脚踝能力要求比较高。随着奥戴丽好笨这样博主的出现,穿高跟鞋跑步、跳跃也成了杂技一般的表演。
2026-06-13 20:56:50
最近在b站上看了不少《蜡笔小新》,还挺有意思的。
它是一部家庭动画,讲述了孩子还上幼儿园时,一家三口(后来加上小葵和小白就是五口)的日常故事。
比如妈妈和儿子出门,结果忘带钥匙,被关在门外。妈妈听到电话响,脑补是老公出事了,用石头砸开玻璃窗;小新出门,碰到陌生大龄未婚姐姐一起躲雨。本来这位姐姐不想搭理他,最后开车送小新回家;幼儿园吉永老师一直在等待男友表白,一帮幼儿园小朋友送上助攻。
可以说是把小孩日常生活中各种场景都拍出来了,比很多知名动漫更接地气点。
2026-06-13 20:44:50
我的工作是写技术博客,优化网站SEO,让用户找到我们。那在AI时代,可以直接问AI了,还有必要写博客吗?
我之前写的博客,其实很多是某个技术具体的应用,比如如何用哪个Linux命令、怎么编译docbook文档。此外,还有很多常识的记录,比如记录某个疾病,可以用什么药物。这种的确问AI更方便了。但博客还是可以当作一种笔记存在,方便自己记忆和查询。
而其它很多随笔,凝聚着作者的情感和经历,是AI没有办法替代的。我看十年前的博客,就像是在跟十年前的自己对话一样。
另外,为什么写博客,要选择什么题目,也主要体现人的智慧和主观能动性。
2026-06-13 20:27:50
今天看江祖平在《小明星大跟班》综艺节目的关于结婚还是不结婚的辩论,她觉得不结婚可以保持神秘感,享受暧昧,而同居的话会原型毕露,难以保持吸引力。
暧昧这个词经常被提到。它原意是光线昏暗,现在主要是指一种模糊的感受,特别是男女之间。通常是双方还没有明确心意的时候。
她经常看我,是不是喜欢我?她让我帮忙,但其实不是只有我才能帮,是什么意思?在这个过程中会形成双方之间的一种情感。
我其实不太喜欢暧昧的关系,我喜欢清楚明确的关系,但有时候喜欢的人却只想搞暧昧。暧昧产生的心动,其实和一个陌生人都很容易产生,并不是真正的适合,缺少深度的链接。这个时候,还是要坚决地将一切继续暧昧的可能斩断。