From 7b0d5b30239a07d440c5a9f2772a4509eb34d751 Mon Sep 17 00:00:00 2001 From: kjy Date: Wed, 25 Mar 2026 04:42:53 +0900 Subject: [PATCH] =?UTF-8?q?=EC=83=81=EC=84=B8=EC=A3=BC=EC=86=8C=20?= =?UTF-8?q?=EB=B2=88=EC=A7=80=20=EC=9D=BC=EB=B0=98=EC=A3=BC=EC=86=8C?= =?UTF-8?q?=EB=A1=9C=20=EC=98=AE=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sendTelegram.ts | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/src/sendTelegram.ts b/src/sendTelegram.ts index 24bdec3..d6be7a0 100644 --- a/src/sendTelegram.ts +++ b/src/sendTelegram.ts @@ -10,6 +10,7 @@ import { testUsers, type TelegramUser, } from "./services/telegram.service"; + import type { RealEstateArticle } from "./generated/prisma"; import * as XLSX from "xlsx"; import { unlink } from "node:fs/promises"; @@ -21,6 +22,41 @@ const telegramService = new TelegramService( false ); +function splitAddress( + detailAddress: string | null | undefined, + baseAddress: string +) { + const safeDetail = detailAddress?.trim() || ""; + const base = baseAddress.trim(); + + if (!safeDetail) { + return { address: base, detailAddress: "" }; + } + + const match = safeDetail.match( + /(^|[\s,])([\d]{1,6}(?:-[\d]{1,6})?)(?:\s*번지)?(?=[\s,]|$)/ + ); + if (!match) { + return { address: base, detailAddress: safeDetail }; + } + + const rawToken = match[2]; + if (!rawToken) { + return { address: base, detailAddress: safeDetail }; + } + + const lot = rawToken.replace(/\s+/g, ""); + const removed = safeDetail + .replace(new RegExp(`(^|[\\s,])${rawToken}(?:\\s*번지)?(?=[\\s,]|$)`), "") + .replace(/\s{2,}/g, " ") + .trim(); + + return { + address: [base, lot].filter(Boolean).join(" ").trim(), + detailAddress: removed, + }; +} + function logWithTime(...args: unknown[]) { console.log(`[${dayjs().format("YYYY-MM-DD HH:mm:ss")}]`, ...args); } @@ -106,6 +142,10 @@ async function createExcelFile( const getPrice = () => { return item.prcInfo; }; + const normalizedAddress = splitAddress( + item.detailAddress || "", + `${item.city || ""} ${item.division || ""} ${item.sector || ""}` + ); return { 매물번호: item.articleNumber, @@ -113,8 +153,8 @@ async function createExcelFile( 소유자구분: getOwnerType(), 매물형태: item.articleName || "", 매매구분: item.tradTpNm || "", - 주소: `${item.city || ""} ${item.division || ""} ${item.sector || ""}`, - 상세주소: item.detailAddress || "", + 주소: normalizedAddress.address, + 상세주소: normalizedAddress.detailAddress, 층수: item.floorInfo || "", 가격: getPrice(), 매물특징: item.articleDescription || "",