PHP读取大型CSV文件的一部分

时间:2016-09-26 08:46:39

标签: php csv parsing

我有一个大型CSV文件。由于存储器问题(使用MySQL),我想尽可能一次只读取它的一部分。

它的CSV可能并不重要。重要的是它需要用新线切割。

示例内容:

Some CSV content
that will break
on a line break

这可能是我的道路:

$path = 'path/to/my.csv';

在我看来,它的解决方案可能如下所示:

$csv_content1 = read_csv_file($path, 0, 100);
$csv_content2 = read_csv_file($path, 101, 200);
  1. 它读取0-100行的原始内容。
  2. 它读取101-200行的原始内容。
  3. 信息

    • 不需要解析(只需拆分成内容)。
    • 该文件存在于我自己的服务器上。
    • 不要将整个文件读入内存。
    • 我希望能够在另一次进行第二次阅读,而不是在同一次运行。如果需要,我接受像指针一样保存临时值。

    我一直试图阅读其他主题,但没有找到与此问题完全匹配的内容。

    也许其中一些可以某种方式起作用?

    • SplFileObject
    • fgetcsv

    在我使用$csv_content2之前,我可能无法使用$csv_content1,因为我需要保存某种指针?在那种情况下,它很好。无论如何,我会按顺序阅读它们。

1 个答案:

答案 0 :(得分:0)

经过深思熟虑和阅读后,我终于认为我找到了解决问题的方法。如果由于内存使用或其他方面这是一个糟糕的解决方案,请纠正我。

首次运行

now()

下次运行

WITH
  MEMBER [Measures].[Key for Today] AS 
    Format
    (
      Now()
     ,'yyyyMMdd'
    ) 
  MEMBER [Measures].[Today string] AS 
    '[Date].[Calendar].[Date].&[' + [Measures].[Key for Today] + ']'  
  MEMBER [Measures].[_YTD] AS 
    Aggregate
    (
      YTD([Date].[Calendar].CurrentMember)
     ,[Measures].[Order Quantity]
    ) 
  MEMBER [Measures].[_MTD] AS 
    Aggregate
    (
      MTD([Date].[Calendar].CurrentMember)
     ,[Measures].[Order Quantity]
    ) 
SELECT 
  {
    [Measures].[_YTD]
   ,[Measures].[_MTD]
  } ON COLUMNS
 ,[Product].[Category].Children ON ROWS
FROM [Adventure Works]
WHERE 
  StrToMember
    (
      [Measures].[Today string]
     ,constrained
    ) ;

<强>功能

$buffer = part($path_to_file, 0, 100);

在我更面向对象的环境中,它看起来更像是这样:

$buffer = part($path_to_file, $buffer['pointer'], 100);