这是我的解决方案。它基于您所描述的结构是固定且一致的假设。
它是书面的 T-SQL (SQL Server)。将其转换为 my-sql 应该没有任何问题。
我反对 vba 解决方案。 SQL 已经足够强大了。
如果您很难实现这一点,我还有一些想法。 (我只是不确定 my-sql 中有什么可用的,必须检查一下)。无论如何 - 它应该可以工作。
--DROP TABLE Example_Table;
CREATE TABLE Example_Table
(
Val VARCHAR(1000),
Row_Num INT IDENTITY(1,1)
);
INSERT INTO Example_Table
SELECT 'John' AS Val UNION ALL
SELECT 'Elm St.' AS Val UNION ALL
SELECT 'Tel Aviv, 151515' AS Val UNION ALL
SELECT 'Doe' AS Val UNION ALL
SELECT 'Manhatten St.' AS Val UNION ALL
SELECT 'Jerusalem, 344343' AS Val UNION ALL
SELECT 'Fox' AS Val UNION ALL
SELECT 'Mulder St.' AS Val UNION ALL
SELECT 'San Francisco, 3243424' AS Val UNION ALL
SELECT 'Jean Lic' AS Val UNION ALL
SELECT 'Picard St.' AS Val UNION ALL
SELECT 'Enterprise City, 3904734' AS Val;
SELECT Name_Details.Val AS Name
, Street_Details.Val AS Street
, SUBSTRING(City_Details.Val, 1, CHARINDEX(',', City_Details.Val, 0) - 1) AS City
, SUBSTRING(City_Details.Val, CHARINDEX(',', City_Details.Val, 0) + 2, LEN(City_Details.Val) - CHARINDEX(',', City_Details.Val, 0)) AS Zip
, City_Details.Val AS City_And_Zip
FROM Example_Table AS Name_Details
INNER JOIN
(SELECT VAL, Row_Num FROM Example_Table AS E WHERE Row_Num % 3 = 2) AS Street_Details
ON (Street_Details.Row_Num = Name_Details.Row_Num + 1)
INNER JOIN
(SELECT VAL, Row_Num FROM Example_Table AS E WHERE Row_Num % 3 = 0) AS City_Details
ON (City_Details.Row_Num = Name_Details.Row_Num + 2)
WHERE Name_Details.Row_Num % 3 = 1 ;
DROP TABLE Example_Table;