使用sql查询结果操作现有pdf文件的文件和数据转换建议

gjmwrych  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(405)

抱歉,如果类似的问题,我问已经解决。我甚至不知道如何最好地框架我的问题,但我还没有找到任何职位,显然是密切相关。我希望有人对此有一些经验,可能愿意提供一些建议。我的公司已经签订了合同,将我们的大部分数据库转换为html,用于etl目的,我们实在无法通过在范围中增加这个额外的要求,将本已难以管理的项目成本翻一番。
我们有一个sql数据库从一个电子病历软件供应商,我们的公司现在已经离开。由于最近的经济因素,我们实在不能再和他们呆在一起了。当我们离开时,这家前供应商不情愿地向我们提供了sql数据库的备份副本,以及我们的用户多年来通过应用程序gui上传的所有扫描图像的副本。我被告知他们将上传的数据存储为blob数据,但事实并非如此。他们根本没有把文件存储在数据库里。相反,他们将图像移动到存储位置,并将id、doctype、filename、dirpath和其他文档信息写入db的document表。这是有道理的,但让我们束手无策。主要是因为文件名似乎是在上传时随机生成的。因此,我们现在有50000个图像文件,文件名难以理解,存储在基于日期的文件夹结构中,无法将其中任何一个与所属的患者关联起来。以下是几个例子:
/root/2020/05102019/69353829-e46b-47e7-ab56-a17624f0dd.pdf
/root/2014/09282017/385ba21d-e108-4cbb-9287-91110c16edb0.jpg
我编译了一个attrib列表,这样就可以使任何一个属性对转换都可用。我拉了:

SELECT * FROM document d
          JOIN patients p ON d.PatientId = p.pid
          JOIN users u ON d.PatientId = u.uid
        WHERE u.UserType = '3' AND d.fileformat is NOT NULL AND d.dirpath LIKE 'm%'
        ORDER BY u.ulname;

这给了我所有的病人和文件属性,形成了一个197列的列表。挑战在于,新的电子病历供应商只能在每个患者的所有文件都位于患者级别的专用文件夹中时导入这些文件,因此我需要新文件夹结构中的文件。我试着不放弃patientid,scan date,description(customname列),scanned by,以及其他一些要点。
为了便于识别,我可能最终会将文件名设置为customname+docid的concat。然后我只需要将文件放在/patient/docs.extension文件夹结构中。
我继续把所有的文件放在一个文件夹里,这样就更容易操作了。我把它们分批放出来:

md "D:\OneDrive\Documents\Assets\eClinicalworks\PID\FTP\mobiledoc\Documents\All\"
        cd /d "D:\OneDrive\Documents\Assets\eClinicalworks\PID\FTP\mobiledoc\Documents\"
        for /r %d in (*) do copy "%d" "D:\OneDrive\Documents\Assets\eClinicalworks\PID\FTP\mobiledoc\Documents\All\"

现在我把它们都放在一起了。
截图
不过,我还是要想办法让病人把它们放到新的文件夹结构中。
刚才提到过,我最初考虑使用sql,这样我就可以在一个步骤中重新创建文件并将所需的attrib指定为文件attrib。
为了回答有关html转换的问题,我们在数据库中有成吨的进度记录、医生记录、处方等。将它们导出到新的电子病历的唯一方法是将它们导出为html,并在患者级别对它们进行分组,以便新供应商可以导入它们。
老实说,在与这些垃圾做斗争之后,我更愿意通过拒绝将它们上传到新的emr来避免这种情况。相反,只需将所有这些文档放在我们的文件服务器上,并为新的电子病历提供一个超级链接,以便插入到每个患者的病历中,从而打开所有患者文件。新的电子病历是基于浏览器的,所以它可能是可行的,但我怀疑我是否能够让他们写文件到我们的文件服务器向前推进,这样做可能只会使最终用户的体验更加脱节。

wd2eg0qa

wd2eg0qa1#

我不认为你们的承包商做错了什么。将上载的文件及其所有问题字符/重复名称(不止一个患者被称为johnsmith.jpg?)等重命名为guid,以便它们可以与其他图像共存,而不会覆盖它们是a)明智的,b)我会做的。
我也不会将图像存储在数据库中,因为那时你唯一能做的就是再次将它们取出;每次你想对他们做任何事的时候都要做的事。能够将图片文件夹Map到web服务器上的url,然后仅使用文件名发送html意味着web服务器可以切断图片而不必将其从数据库中拉出;db不必卷入毫无意义的io。
将这些图像与所属患者关联的方法是由数据库完成的。数据库结构中的其他地方将是一个带有documentid列的病历,该列链接到此文档记录,或者一个带有patientid/documentid对的patientdocuments表。
如果没有,那么在数据库中存储文档字节将无助于将它们与患者联系起来,因为这种关系不是关于图像的字节在哪里,而是关于存储了哪些其他数据以使系统可用。因为它站在你的想法在这个问题上,上传成千上万的图片到一个数据库只是为了让你可以。。。呃。。把他们都弄出来,似乎表明你还没有完全理解为什么你的承包商这么做的背后的原因。
因为您的印象是您可以做到这一点,所以您似乎知道db如何将文档与患者关联(如果没有关联,则您建议的过程将失败),因此您可以安排适当的重命名过程,而无需将图像数据移动到任何位置。本质上,您没有看到一个根据唯一路径存储文件数据的文件系统与一个根据唯一id存储文件数据的数据库表没有区别。文档的数据库表非常清晰,因此可以将指向文件系统/文件系统的链接视为文档表的扩展。您需要db中的其他表来理解文件,但是需要db中的其他表来理解db中的任何表。这些是建模相关数据的关键概念
我不建议你进行你提议的程序,但我相信这不会阻止你。然后考虑一下(因为你没有发布任何我们可以处理的细节)这个假设场景:

Patients
Name,DocumentId
John Smith,1
Jane Doe,2

Documents
Id,FilePath
1,'/root/2020/05102019/69353829-e46b-47e7-ab56-a1762424f0dd.pdf'
2,'/root/2014/09282017/385ba21d-e108-4cbb-9287-91110c16edb0.jpg'

SELECT CONCAT('REN ', d.filePath, ' "',  p.Name, RIGHT(d.filePath, 4), '"') 
FROM
  Patients p 
  INNER JOIN Documents d ON p.DocumentId = d.DocumentId

查询的结果基本上是一个批处理文件,其中包含重命名命令,这些命令将所有文件重命名为一个文件夹,并按患者姓名组织。
现在你的多个同名病人会互相覆盖,一切都会一团糟
这也让我明白了“不要在数据库中存储文件”的观点——看看在文件系统中操作文件是多么容易,使用现有的命令可以理解文件系统和文件并执行重命名文件、提取exif数据、旋转、调整大小和打印等操作。。。如果所有这些图像都在你的数据库里,你唯一能做的就是把它们拿出来;sqlserver不能旋转、调整大小、打印等blob数据,但是有成千上万的工具可以理解文件并可以转换它们—这些工具无法理解您的db,因此将文件放入db会使您面临这样一个问题:在再次挖掘之前,这些文件将变得毫无用处
你的承包商可能没有你想象的那么愚蠢;暂停片刻,然后你开始破解他们所做的一切,并质疑你的驱动程序这样做是否真的是正确的。如果接待处的jane需要查看john smith的照片(驾驶执照为xy1234)以确定他的身份,请不要向她提供一个共享的驱动器,其中包含所有人的照片,并让她双击、拖动并在文件系统中意外删除。为她提供一个在数据库中查找的应用程序,从磁盘中获取无法理解但有用的唯一文件名,并打开它供她查看。并使文件系统对除应用程序以外的所有人都是只读的,这样用户就不会破坏东西

相关问题