将制表符分隔符更改为另一个字符
Change tabula separator to another character
我需要从 pdf 中捕获一些数据并输入到 excel 文件中,但是要创建一个宏来组织单元格,我需要除“,”。因为一些价值数据需要“,”来表示美分。有任何想法吗 ? (“/”或“-”等字符即可解决问题)
当我将 pdf 转换为 csv 时,所有数据都位于一个单元格中,这就是我需要使用宏的原因。
How my data is organized into excel
from tabula import read_pdf
from tabula import convert_into
convert_into("B.pdf", "BBBBB.csv", output_format="csv", pages=1,coding = 'latin-1',stream=True, guess = False ,
area = (306.9,253,379,570),
columns = (347,399.1,443.4,481.6,514.3,543.5,572))
数据值中的“,”已在 " "
标记内正确转义,并且可以正常工作。问题是您的 Excel 没有使用 ,
作为字段分隔符。 IIRC,您可以在 Excel 方面通过使用 File->import
而不是仅仅尝试打开 CSV 文件来克服这个问题。这样 Excel 将提示您输入 CSV 参数。
否则,更改分隔符的 Python CSV writer 参数正好是 "delimiter" -
不幸的是,Tabula-py 只是通过外部进程调用的 tabula-java 的包装器,并且不接受更改分隔符的选项。否则,这将是添加一个 delimiter=...
的问题
您通话中的参数。
然而,最简单的方法似乎是将 Java 端生成的 CSV 文件重新转换为带有“;”的文件。提取数据后的分隔符:
(示例包装函数比较完整,但是最后四行代码就完成了转换)
import csv
from pathlib import Path
from tabula import read_pdf
from tabula import convert_into
def convert(input_file, output_file, encoding="latin1", area=None, columns=None, delimiter=";"):
if area is None:
area = (306.9, 253, 379, 570)
if columns is None:
columns = (347, 399.1, 443.4, 481.6, 514.3, 543.5, 572)
if delimiter != ",":
final_output = Path(output_file)
# temporary name
output_file = final_output.parent / (final_output.stem + "_tmp" + final_output.suffix)
# perform the actual data extraction and CSV output
convert_into(
input_file,
output_file,
output_format="csv",
pages=1,
coding="latin-1",
stream=True,
guess=False,
area=area,
columns=columns,
)
if delimiter != ",":
# if needed, convert the CSV file to use the required delimiters:
try:
with open(output_file) as tabula_csv, open(final_output) as final_csv:
reader = csv.reader(tabula_csv)
writer = csv.writer(final_csv, delimiter=delimiter)
writer.writerows(reader)
else:
# if everything was ok on conversion, remove temporary file:
output_file.unlink()
如果您想继续使用 convert_into
,您可以设置 output_format="tsv"
,它将 table 转换为制表符分隔格式。 https://tabula-py.readthedocs.io/en/latest/tabula.html#tabula.wrapper.convert_into
除此之外,您可以使用 read_csv
转换为 DataFrame,然后使用 df.to_csv
并设置定界符。
我需要从 pdf 中捕获一些数据并输入到 excel 文件中,但是要创建一个宏来组织单元格,我需要除“,”。因为一些价值数据需要“,”来表示美分。有任何想法吗 ? (“/”或“-”等字符即可解决问题)
当我将 pdf 转换为 csv 时,所有数据都位于一个单元格中,这就是我需要使用宏的原因。 How my data is organized into excel
from tabula import read_pdf
from tabula import convert_into
convert_into("B.pdf", "BBBBB.csv", output_format="csv", pages=1,coding = 'latin-1',stream=True, guess = False ,
area = (306.9,253,379,570),
columns = (347,399.1,443.4,481.6,514.3,543.5,572))
数据值中的“,”已在 " "
标记内正确转义,并且可以正常工作。问题是您的 Excel 没有使用 ,
作为字段分隔符。 IIRC,您可以在 Excel 方面通过使用 File->import
而不是仅仅尝试打开 CSV 文件来克服这个问题。这样 Excel 将提示您输入 CSV 参数。
否则,更改分隔符的 Python CSV writer 参数正好是 "delimiter" -
不幸的是,Tabula-py 只是通过外部进程调用的 tabula-java 的包装器,并且不接受更改分隔符的选项。否则,这将是添加一个 delimiter=...
的问题
您通话中的参数。
然而,最简单的方法似乎是将 Java 端生成的 CSV 文件重新转换为带有“;”的文件。提取数据后的分隔符:
(示例包装函数比较完整,但是最后四行代码就完成了转换)
import csv
from pathlib import Path
from tabula import read_pdf
from tabula import convert_into
def convert(input_file, output_file, encoding="latin1", area=None, columns=None, delimiter=";"):
if area is None:
area = (306.9, 253, 379, 570)
if columns is None:
columns = (347, 399.1, 443.4, 481.6, 514.3, 543.5, 572)
if delimiter != ",":
final_output = Path(output_file)
# temporary name
output_file = final_output.parent / (final_output.stem + "_tmp" + final_output.suffix)
# perform the actual data extraction and CSV output
convert_into(
input_file,
output_file,
output_format="csv",
pages=1,
coding="latin-1",
stream=True,
guess=False,
area=area,
columns=columns,
)
if delimiter != ",":
# if needed, convert the CSV file to use the required delimiters:
try:
with open(output_file) as tabula_csv, open(final_output) as final_csv:
reader = csv.reader(tabula_csv)
writer = csv.writer(final_csv, delimiter=delimiter)
writer.writerows(reader)
else:
# if everything was ok on conversion, remove temporary file:
output_file.unlink()
如果您想继续使用 convert_into
,您可以设置 output_format="tsv"
,它将 table 转换为制表符分隔格式。 https://tabula-py.readthedocs.io/en/latest/tabula.html#tabula.wrapper.convert_into
除此之外,您可以使用 read_csv
转换为 DataFrame,然后使用 df.to_csv
并设置定界符。