Python - 将稀疏矩阵转换为JSON

时间:2017-09-08 10:24:35

标签: python json data-structures sparse-matrix

寻找在Python中将稀疏矩阵(从文本文件)转换为JSON格式(这将更容易解析为HTML表格)的方法。除非必要,否则不打算重新发明轮子,所以如果有一个已经存在的库,请告诉我!

示例输入将是(其中第一个数字始终为1或0 - 对于true或false,所有值由空格分隔,列/索引由冒号前的数字指示):

1 1:2 3:1
1 2:3

为了帮助你们理解输入,下面是相同的输入,只包括零值和列标题:

Flag    Col1   Col2   Col3   Col4   Col5
1       1:2    2:0    3:1    4:0    5:0
1       1:0    2:3    3:0    4:0    5:0    

首选输出(以JSON格式):

[
    {
            Flag: "1",
            Col1: "2",
            Col2: "0",
            Col3: "1",
            Col4: "0",
            Col5: "0",
        }
    {
            Flag: "1",
            COl1: "0",
            Col2: "3",
            Col3: "0",
            COl4: "0",
            Col5: "0",
        }
]

2 个答案:

答案 0 :(得分:1)

我认为此代码可以解决您的问题:

import json

with open('matrix.txt') as f:
    content = [x.strip() for x in f.readlines()]
    result = []
    for line in content:
        elems = line.split(' ')
        D = {x[0]:int(x[2]) for x in elems[1:]}
        row = {"Col"+str(i):D.get(str(i),0) for i in range(1,6)}
        row["Flag"] = int(elems[0])
        result.append(row)
    print(json.dumps(result, indent=4))

考虑到您的矩阵位于文件matrix.txt中,对于每一行,您将获得标记值并创建对的字典(列,值)。然后,很容易迭代可能的列范围,并获得第i列的字典值(如果未找到,则为0)。在这里,我认为您的矩阵总是有5列,否则会更改range

最后,您可以使用json库转换所有生成的数据。 indent参数仅用于“美化”输出并使其更具可读性,无需在最终代码中使用它。

答案 1 :(得分:1)

USE [ProjectDB]
GO
/****** Object:  StoredProcedure [dbo].[generateTransRefNo]    Script Date: 9/9/2017 7:19:55 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[generateTransRefNo]

(

    @year varchar(max),
    @txrefno varchar(max) output
)

AS
BEGIN
BEGIN TRANSACTION
SET NOCOUNT ON
DECLARE @seq varchar(max)
set @seq = '00000000'
select @txrefno = sequence from TBSEQUENCE WITH (TABLOCK, HOLDLOCK) where year =@year
if(@txrefno='' or @txrefno is null)
begin
insert into TBSEQUENCE values (substring(cast(DATEPART(year, GETDATE()) as varchar),3,4),1,'YR')
end
select @txrefno = concat(year,SUBSTRING('00000000',1,8- len(sequence)),sequence) from TBSEQUENCE where year =@year
update TBSEQUENCE set sequence = sequence+1 where year=@year
COMMIT TRANSACTION
END 
select @txrefno

通过使用此功能,您可以获得json。只需按照您在问题中说的那样传递文本文件名。